3 回答

TA貢獻1875條經驗 獲得超3個贊
在的析構函數中std::thread,std::terminate如果發生以下情況,則稱為:
線程未加入(帶有t.join())
并且也未與(分離t.detach())
因此,你應該總是要么join還是detach一個線程執行的流之前到達析構函數。
當程序終止(即main返回)時,不會等待在后臺執行的其余分離線程;相反,它們的執行被掛起,并且它們的線程本地對象被破壞。
至關重要的是,這意味著不會解開那些線程的堆棧,因此不會執行某些析構函數。根據那些破壞者應該采取的行動,情況可能像程序崩潰或被殺死一樣糟糕。希望操作系統將釋放文件等上的鎖,但是您可能損壞了共享內存,半寫文件等。
因此,您應該使用join還是detach?
采用 join
除非您需要更大的靈活性并且愿意提供同步機制來獨自等待線程完成,否則您可以使用detach

TA貢獻1808條經驗 獲得超4個贊
detach如果您不打算等待線程完成,則應調用,join而線程將一直運行直到完成,然后終止而不必讓主線程專門等待它。
detach基本上會釋放能夠實施所需的資源join。
這是一個致命的錯誤,如果一個線程對象結束其生命,并沒有join,也不detach曾被稱為; 在這種情況下terminate被調用。

TA貢獻1921條經驗 獲得超9個贊
這個答案的目的是在標題答題,而不是解釋之間的差異join和detach。那么什么時候應該std::thread::detach使用?
在正確維護的C ++代碼中std::thread::detach,根本不應使用。程序員必須確保所有創建的線程正常退出以釋放所有獲取的資源并執行其他必要的清理操作。這意味著通過調用放棄線程所有權detach不是一種選擇,因此join應在所有情況下使用。
但是,某些應用程序依賴于可能包含無限阻塞功能的舊的且通常設計不完善且受支持的API。將這些函數的調用移到專用線程中以避免阻塞其他內容是一種常見的做法。無法使此類線程正常退出,因此使用of join只會導致主線程阻塞。在這種情況下,使用detach而不是thread用動態存儲持續時間分配對象然后有意地泄漏對象的方法不太邪惡。
#include <LegacyApi.hpp>
#include <thread>
auto LegacyApiThreadEntry(void)
{
auto result{NastyBlockingFunction()};
// do something...
}
int main()
{
::std::thread legacy_api_thread{&LegacyApiThreadEntry};
// do something...
legacy_api_thread.detach();
return 0;
}
- 3 回答
- 0 關注
- 2607 瀏覽
添加回答
舉報