C++11 thread类join()阻塞问题?

aksufign 2016-03-01 05:55:50
完成端口的多个工作者线程问题。代码如下:
1,创建多个工作者线程代码:

vector<thread> m_WorkThreadArray; // 一个线程容器
for (int i = 0; i < m_ThreadCount; i++)
{
WorkThreadParams* pWorkThreadParam = new WorkThreadParams;
pWorkThreadParam->m_pIOCP = this;
pWorkThreadParam->m_ThreadNo = i + 1;
m_WorkThreadArray.push_back(thread(_WorkerThread, pWorkThreadParam));
} // _WorkerThread : 工作者线程函数,pWorkThreadParam, 工作者线程函数参数

2,中止全部工作者线程代码:

for (int i = 0; i < m_ThreadCount; i++)
{
PostQueuedCompletionStatus(m_hIOCompletionPort, 0, (DWORD)EXIT_CODE, NULL);
}
for (size_t i = 0; i < m_WorkThreadArray.size(); i++)
{
if (m_WorkThreadArray[i].joinable())
m_WorkThreadArray[i].join();
}

3,工作者线程部分代码:

for (;;)
{
BOOL bIOCPReturn = GetQueuedCompletionStatus(
pIOCP->m_hIOCompletionPort,
&dwBytesTransfered,
(PULONG_PTR)&pSocketContext,
&pOverlapped,
INFINITE
);
if (EXIT_CODE == pSocketContext)
{
break;
}
return;
}

现在问题是,调用m_WorkThreadArray[i].join();这行代码的时候,阻塞在这不会动了,本来想要在所有工作者线程全部退出之后再做些其他工作的,请问什么问题?
...全文
1841 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
FD_2013 2017-11-07
  • 打赏
  • 举报
回复
用detach()吧, 然后在线程里面加一个状态开关,主线程获取线程的状态之后再往下执行
赵4老师 2017-11-06
  • 打赏
  • 举报
回复
小心驶得万年船。
li374456042 2017-11-06
  • 打赏
  • 举报
回复
我遇到过这个问题,重建线程的时候要判断线程是否创建成功,如果线程创建失败,不能调用join的。
mashilin4 2017-11-06
  • 打赏
  • 举报
回复
请问 楼主 问题解决了吗 我也遇到 同样的情况。。。
开心秋水 2017-11-06
  • 打赏
  • 举报
回复
join()会阻塞住,等待其线程函数执行完毕。你的线程函数是一个死循环,那个变量为EXIT_CODE才会break,很可能那个变量一直不是EXIT_CODE
aksufign 2016-03-02
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
那就是工作线程还在执行呗
在工作线程的return;之前放了打印代码,可以看到执行到了return;语句。所以我蒙逼了。
dustpg 2016-03-01
  • 打赏
  • 举报
回复
那就是工作线程还在执行呗
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含的高级技术、的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含型转换、文件操作、异常处理、代码重用等内容。

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧