我正在尝试在程序终止时优雅地进行清理,因此我在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));
,其中runThread
是unique_ptr<std::thread>
,成员是GameLoop
。 join()
调用来自GameLoop
对象的析构函数。
如果它的对象正在被销毁的过程中,循环线程可能无法完成?根据调试器,循环线程在msvcr120d.dll
的暗深处继续存在。如果是这样,你会怎么处理它?</ p>
注意:此处为std::thread
新手!
更新:这是我加入析构函数的调用:
run = false;
if (runThread->joinable())
{
runThread->join();
}
更新2:如果我删除join()
,我会收到~thread()
引发的异常!
答案 0 :(得分:4)
当然,当你join
一个不会导致线程终止的线程时。它只是阻塞,直到该线程死于自然(或不自然)的原因。
为了优雅地清理多线程应用程序,你需要以某种方式告诉工作线程它是时候死了,然后等待死亡发生。 “等待死亡发生”部分是join
的用途。
答案 1 :(得分:1)
GameLoop
是静态GameSystem
中包含的非静态对象。我将检查这是否属实并更新。
是的,确认。只是我的运气,在第一次使用时遇到错误!