【发布时间】:2013-11-13 18:53:25
【问题描述】:
我正在尝试在程序终止时优雅地清理,所以我在 std::thread 上调用 join() 以等待它完成。这似乎永远阻塞了主线程,但我不明白为什么,因为工作线程是一个(几乎)空循环,如下所示:
void GameLoop::Run()
{
while (run)
{
// Do stuff...
}
std::cout << "Ending thread...\n";
}
当然,我在 joining 之前将 run 设置为 false。现在,我怀疑这与它是一个成员函数并在对象destruction 上被调用有关。我正在创建这样的线程:runThread.reset(new thread(&GameLoop::Run, this));,其中runThread 是unique_ptr<std::thread> 和GameLoop 的成员。 join() 调用来自 GameLoop 对象的析构函数。
如果它的对象正在被销毁,循环线程可能无法完成?根据调试器的说法,循环线程在msvcr120d.dll 的黑暗深处徘徊。如果有,你会怎么处理?
注意:这里是std::thread 的新手!
更新:这是我加入析构函数的呼吁:
run = false;
if (runThread->joinable())
{
runThread->join();
}
更新 2:如果我删除 join(),我会收到 ~thread() 引发的异常!
【问题讨论】:
-
我希望你在某处将 run 设置为 false/0... 将其定义为 volatile 是个好主意。
-
你能贴出你的析构函数的相关代码吗?
-
@AlexFarber - 将其定义为
std::atomic是一个更好的主意。volatile没有可移植语义,对线程间同步没有用处。 -
如果你删除了 join(),你会得到一个异常,因为线程对象在线程完成之前不能被破坏(除非已经调用了 detach)。
-
我对你描述的代码的作用没有任何问题...coliru.stacked-crooked.com/a/7555dac44353ca50
标签: c++ multithreading c++11 stdthread