首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为啥线程指定的Routine返回之后 WaitForSingleObject无法返回

2013-08-16 
为什么线程指定的Routine返回之后 WaitForSingleObject无法返回?封装了一个线程类然后定义为全局的static

为什么线程指定的Routine返回之后 WaitForSingleObject无法返回?
封装了一个线程类
然后定义为全局的static对象

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

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


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


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

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

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

做了多种尝试 但是还是没法解决问题。
希望有人人帮忙解答。
[解决办法]
beginthreadex  最好用这个,你断点看看,是不是其他的线程一直占用着资源,或者你查看看你的线程中有没有写死循环之类的。
[解决办法]
WaitForSingleObject 的第二个参数,表示调用线程等待的阻塞时间。

但是你传0xFFFFFFFF的话,相当于宏INFINITE,这个值其实没必要用这个的,
当你的ThreadHandle状态没有通知到WaitForSingleObject接口的话,
可能就是死锁状态了!

热点排行