我有这个奇怪的问题,我创建的线程即使从线程函数退出后也不会终止。我创建了这样的线程:
typedef void(*Task)(void*);
AsyncWorker(Task proc, void* arg): thd_(NULL) {
thd_ = new std::thread(proc, arg);
}
~AsyncWorker() {
if (thd_) {
if(thd_->joinable())
thd_->join(); // does not return from here
delete thd_;
}
}
这是线程执行的任务:
static void RunLoop(void* arg)
{
if (!arg)
return;
SomeObject* thiz = static_cast<SomeObject*>(arg);
while( !(thiz->done_) ) {
thiz->DoInLoop();
}
return;
}
我将主成员SomeObject::done_
设置为true
并删除AsyncWorker
。当我单步执行调试器时,我可以看到该线程已从RunLoop
函数退出但在dtor中调用join
时会挂起。线程和主线程的调用堆栈显示
[External Code]
[No symbols loaded for ntdll.dll]
可能是什么问题? SomeObject::DoInLoop
方法确实等待互斥锁,但是我在删除AsyncWorker
对象之前发出互斥信号,这样线程就可以超过它,并且在任何情况下如果线程已从线程proc退出,那么它显然不是坚持任何互斥体,对吧?令人沮丧的是,调用堆栈并没有告诉我卡在哪里。
最初,我认为这是一个问题我是如何使用std::thread
(我是第一次使用它们),但是我尝试了同样的Windows线程并遇到了同样的问题。所以我一定做错了。
编辑:我最初将问题标记为vs2012
,但实际上我使用的是vs2013 sp1。