Kri*_*ato 4 c++ multithreading c++11 stdthread
我试图在程序终止时优雅地清理,所以我正在调用join()astd::thread等待它完成。这似乎只是永远阻塞了主线程,但我不明白为什么,因为工作线程是一个(几乎)空循环,如下所示:
void GameLoop::Run()
{
while (run)
{
// Do stuff...
}
std::cout << "Ending thread...\n";
}
Run Code Online (Sandbox Code Playgroud)
当然,我run在joining之前设置为 false 。现在,我怀疑它与它是一个成员函数并在 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();
}
Run Code Online (Sandbox Code Playgroud)
更新2:如果我删除join()我得到引发异常~thread()!
当然,当你join的线程不会导致线程终止时。它只是阻塞,直到该线程因自然(或非自然)原因死亡。
为了优雅地清理多线程应用程序,您需要以某种方式告诉工作线程它是时候死亡了,然后等待死亡发生。“等待死亡发生”部分join是为了。
| 归档时间: |
|
| 查看次数: |
13347 次 |
| 最近记录: |