标签:stdthread c c11 multithreading
我试图在程序终止时优雅地清理,所以我在std :: thread上调用join()来等待它完成.这似乎只是永远阻止主线程,但我不明白为什么,因为工作线程是一个(几乎)空循环,如下所示:
void GameLoop::Run()
{
while (run)
{
// Do stuff...
}
std::cout << "Ending thread...\n";
}
当然,我在加入之前设置为false.现在,我怀疑它与它是一个成员函数并被称为对象破坏有关.我正在创建这样的线程: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()引发的异常!
解决方法:
当然,当你加入一个不会导致线程终止的线程时.它只是阻塞,直到该线程死于自然(或不自然)的原因.
为了优雅地清理多线程应用程序,您需要以某种方式告诉工作线程是时候死亡,然后等待死亡发生. “等待死亡发生”的部分是加入的目的.
标签:stdthread,c,c11,multithreading 来源: https://codeday.me/bug/20190831/1775001.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。