即使线程从线程proc退出,std :: thread :: join也会挂起

时间:2014-05-15 12:53:43

标签: windows multithreading c++11 visual-studio-2013 stdthread

我有这个奇怪的问题,我创建的线程即使从线程函数退出后也不会终止。我创建了这样的线程:

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。

0 个答案:

没有答案