在C++的多线程中,join()
和detach()
有什么不同? 是否join()
杀死线程?C++中多线程的join()和detach()之间有什么不同?
7
A
回答
14
A C++ thread
对象一般(但不总是)表示执行的线程,这是一个操作系统或平台的概念。
当调用thread::join()
时,调用线程将阻塞,直到执行线程完成。基本上,这是一个可以用来知道线程何时完成的机制。当thread::join()
返回时,OS执行线程已完成,C++ thread
对象可能被销毁。
的thread::detach()
被调用时,执行的线程是“分离”从thread
对象,并通过一个thread
对象不再表示 - 它们是两个独立的东西。 C++ thread
对象可以被销毁,并且OS的执行线程可以继续。如果程序需要知道该执行线程何时完成,则需要使用其他一些机制。 join()
不能在该对象上调用,因为它不再与执行的线程相关联。
在仍然“可连接”的同时销毁C++ thread
对象被认为是错误的。也就是说,为了摧毁C++ thread
对象,必须调用join()
(或完成)或必须调用detach()
。如果C++ thread
对象在被销毁时仍然可以连接,则会抛出异常。
其它一些方法,一个C++ thread
对象将不能代表执行的线程(即,可以是不能加入。):
- 默认构造
thread
对象不表示执行的线程,所以是不可连接。 - 已经移动的线程将不再表示一个执行线程,因此不可连接。
3
join()
不杀死线程。实际上它等到线程主函数返回。所以,如果你的线程的主要功能如下:
while (true) {
}
join()
会永远等待。
detatch()
也不杀死线程。实际上它告诉std::thread
即使std::thread
对象被破坏,该线程仍应继续运行。 C++在std :: thread析构函数中检查线程是否加入或分离,并在检查失败时终止程序。
因此,如果您取消main
函数中第一行的注释,它将会崩溃。如果您取消注释第二或第三行,它将正常工作。
#include <thread>
void func() {
}
void fail1() {
std::thread t(func);
// will fail when we try to destroy t since it is not joined or detached
}
void works1() {
std::thread t(func);
t.join();
}
void works2() {
std::thread t(func);
t.detach();
}
int main() {
// fail1();
// works1();
// works2();
}
相关问题
- 1. 时间多线程和超线程之间有什么区别?
- 2. Inner Join,Cross Join和Left Outer Join之间有什么区别?
- 3. 线程上的“detach()”是什么? CPP
- 4. TaskStackBuilder.addParentStack()和TaskStackBuilder.addNextIntent()之间有什么不同?
- 5. app.params()和router.params()之间有什么不同?
- 6. ConfigurationManager.GetSection和Configuration.GetSection之间有什么不同?
- 7. ComboViewer和Combo之间有什么不同?
- 8. “TextClock”和“DigitalClock”之间有什么不同?
- 9. JConnection和JDBC之间有什么不同?
- 10. *&aPtr和&* aPtr之间有什么不同?
- 11. InternalResourceViewResolver和UrlBasedViewResolver之间有什么不同
- 12. paintcomponent()和paintcomponents()之间有什么不同?
- 13. GIS和GPS之间有什么不同?
- 14. WAS和IIS之间有什么不同?
- 15. 多线程和任务之间有什么区别?
- 16. Linux Windows之间的多任务,多线程有什么区别?
- 17. C++ 11线程detach不工作
- 18. SQL - JOIN和比较不同表中的两行之间的区别是什么?
- 19. 在FragmentTransaction中使用add()。addToBackStack(),add()。detach()和replace()。addToBackStack()之间有什么区别?
- 20. 异步和多线程之间的内部区别是什么?
- 21. JavaScript线程和Silverlight UI线程之间的关系是什么?
- 22. 用户级线程和协程之间有什么区别?
- 23. Zookeeper $状态中的isAlive()和isConnected()之间有什么不同? (3.4.5)
- 24. Javascript中的Ajax和Web Worker之间有什么不同?
- 25. 代码中的字符串和stringbuilder之间有什么不同?
- 26. 猫鼬中的Date.now()和Date.now之间有什么不同?
- 27. 为什么此程序的输出在C和C++之间不同?
- 28. 什么意思是在'unix'中的'detach'线程?
- 29. C和%之间有什么区别?
- 30. bootstrap.css和bootstrap.min.css之间有什么不同之处