4

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

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

当然,我在ingrun之前设置为 false 。join现在,我怀疑它与它是一个成员函数并被调用 object destroy有关。我正在创建这样的线程:runThread.reset(new thread(&GameLoop::Run, this));, where runThreadisunique_ptr<std::thread>GameLoop. join()调用来自对象的析构函数GameLoop

如果它的对象正在被销毁,循环线程可能无法完成?根据调试器,循环线程在msvcr120d.dll. 如果是这样,你会如何处理?

当心:新来std::thread这里!

更新:这是我加入析构函数的呼吁:

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

更新2:如果我删除join()我得到一个异常~thread()

4

2 回答 2

5

当然,当您join的线程不会导致线程终止时。它只是阻塞,直到该线程因自然(或非自然)原因而死亡。

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

于 2013-11-13T18:58:10.150 回答
1

啊,显然运行时库中有一个错误。根据这个问题,线程在静态对象的析构函数中没有成功结束。MyGameLoop是包含在 static 中的非静态对象GameSystem。我会检查这是否属实并更新。

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

于 2013-11-13T19:50:10.490 回答