等待std :: thread完成

时间:2013-11-13 18:53:26

标签: c++ multithreading c++11 stdthread

我正在尝试在程序终止时优雅地进行清理,因此我在join()上调用std::thread以等待它完成。这似乎只是永远阻止主线程,但我不明白为什么,因为工作线程是一个(几乎)空循环,如下所示:

void GameLoop::Run()
{
    while (run)
    {
        //  Do stuff... 
    }   
    std::cout << "Ending thread...\n";
}

当然,我在run之前将join设置为false。现在,我怀疑它与成员函数有关,并被称为对象销毁。我正在创建这样的主题:runThread.reset(new thread(&GameLoop::Run, this));,其中runThreadunique_ptr<std::thread>,成员是GameLoopjoin()调用来自GameLoop对象的析构函数。

如果它的对象正在被销毁的过程中,循环线程可能无法完成?根据调试器,循环线程在msvcr120d.dll的暗深处继续存在。如果是这样,你会怎么处理它?<​​/ p>

注意:此处为std::thread新手!

更新:这是我加入析构函数的调用:

run = false;
if (runThread->joinable())
{
    runThread->join();
}

更新2:如果我删除join(),我会收到~thread()引发的异常!

2 个答案:

答案 0 :(得分:4)

当然,当你join一个不会导致线程终止的线程时。它只是阻塞,直到该线程死于自然(或不自然)的原因。

为了优雅地清理多线程应用程序,你需要以某种方式告诉工作线程它是时候死了,然后等待死亡发生。 “等待死亡发生”部分是join的用途。

答案 1 :(得分:1)

啊,显然,运行时库中存在一个错误。根据{{​​3}},线程不会在静态对象的析构函数中成功结束。我的GameLoop是静态GameSystem中包含的非静态对象。我将检查这是否属实并更新。

是的,确认。只是我的运气,在第一次使用时遇到错误!