我正在尝试在程序终止时优雅地进行清理,所以我呼吁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 runThread
isunique_ptr<std::thread>
和GameLoop
. join()
调用来自对象的析构函数GameLoop
。
如果它的对象正在被销毁,循环线程可能无法完成?根据调试器,循环线程在msvcr120d.dll
. 如果是这样,你会如何处理?
当心:新来std::thread
这里!
更新:这是我加入析构函数的呼吁:
run = false;
if (runThread->joinable())
{
runThread->join();
}
更新2:如果我删除join()
我得到一个异常~thread()
!