我正在尝试在程序终止时优雅地进行清理,所以我呼吁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()!