有时我必须使用std :: thread来加速我的应用程序.我也知道join()等待一个线程完成.这很容易理解,但调用detach()和不调用它有什么区别?
我认为没有detach(),线程的方法将独立使用线程.
不分离:
void Someclass::Somefunction() {
//...
std::thread t([ ] {
printf("thread called without detach");
});
//some code here
}
呼叫分离:
void Someclass::Somefunction() {
//...
std::thread t([ ] {
printf("thread called with detach");
});
t.detach();
//some code here
}
解决方法:
在std :: thread的析构函数中,如果符合以下条件,则调用std :: terminate:
>线程未加入(使用t.join())
>并且没有分离(使用t.detach())
因此,在执行流程到达析构函数之前,应始终加入或分离线程.
当程序终止(即主要返回)时,不等待在后台执行的剩余分离线程;相反,他们的执行被暂停,他们的线程本地对象被破坏.
至关重要的是,这意味着这些线程的堆栈没有被解开,因此一些析构函数不会被执行.根据这些破坏者应该采取的行动,这可能就像程序崩溃或被杀死一样糟糕.希望操作系统将释放文件锁等…但你可能已经损坏共享内存,半写文件等.
那么,你应该使用加入还是分离?
>使用加入
>除非你需要更多的灵活性并且愿意提供同步机制来等待你自己的线程完成,在这种情况下你可以使用detach
标签:stdthread,c,c11 来源: https://codeday.me/bug/20190916/1807197.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。