为什么线程指定的Routine返回之后 WaitForSingleObject无法返回?

Damn_boy 2013-08-15 02:39:29
封装了一个线程类
然后定义为全局的static对象

我把中止线程的操作放在对象的析构函数里

这样在主线程退出之后 会调用到析构函数进而终止线程执行

class CIHaveThread
{
public:
CIHaveThread()
{
CreateThread();
}
~CIHaveThread()
{
TerminalThread()
{
SingleExit();
::WaitForSingleObject(ThreadHandle, 0xFFFFFFFF);
}
}
}


但是问题出来了
虽然析构函数通知了线程退出 并且Debug里也跟到了线程执行到了return
但是主线程却一直卡在::WaitForSingleObject
打开调试信息可以看到对应线程id的线程还在
如果把创建线程的函数从CreateThread 替换为beginthreadex
打开调试信息则看不到对应线程id的线程 但是::WaitForSingleObject依然处于阻塞状态 无法返回

是否是我使用的方法不当
static对象是在主线程return之后才释放
也就变成了我开启的线程在主线程return之后才尝试退出

规范的用法是不是应该在主线程return之前尝试退出所有的子线程?

做了多种尝试 但是还是没法解决问题。
希望有人人帮忙解答。
...全文
241 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Damn_boy 2013-08-15
  • 打赏
  • 举报
回复
以解决 Loader Lock问题 DllMain和多线程问题
max_min_ 2013-08-15
  • 打赏
  • 举报
回复
WaitForSingleObject 的第二个参数,表示调用线程等待的阻塞时间。 但是你传0xFFFFFFFF的话,相当于宏INFINITE,这个值其实没必要用这个的, 当你的ThreadHandle状态没有通知到WaitForSingleObject接口的话, 可能就是死锁状态了!
漫步者、 2013-08-15
  • 打赏
  • 举报
回复
beginthreadex 最好用这个,你断点看看,是不是其他的线程一直占用着资源,或者你查看看你的线程中有没有写死循环之类的。

64,654

社区成员

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

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