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();这行代码的时候,阻塞在这不会动了,本来想要在所有工作者线程全部退出之后再做些其他工作的,请问什么问题?
...全文
2097 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
那就是工作线程还在执行呗

65,189

社区成员

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

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