在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之間有什麼不同之處