3 回答

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

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
detach如果您不打算等待線程完成,則應(yīng)調(diào)用,join而線程將一直運(yùn)行直到完成,然后終止而不必讓主線程專(zhuān)門(mén)等待它。
detach基本上會(huì)釋放能夠?qū)嵤┧璧馁Y源join。
這是一個(gè)致命的錯(cuò)誤,如果一個(gè)線程對(duì)象結(jié)束其生命,并沒(méi)有join,也不detach曾被稱(chēng)為; 在這種情況下terminate被調(diào)用。

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
這個(gè)答案的目的是在標(biāo)題答題,而不是解釋之間的差異join和detach。那么什么時(shí)候應(yīng)該std::thread::detach使用?
在正確維護(hù)的C ++代碼中std::thread::detach,根本不應(yīng)使用。程序員必須確保所有創(chuàng)建的線程正常退出以釋放所有獲取的資源并執(zhí)行其他必要的清理操作。這意味著通過(guò)調(diào)用放棄線程所有權(quán)detach不是一種選擇,因此join應(yīng)在所有情況下使用。
但是,某些應(yīng)用程序依賴于可能包含無(wú)限阻塞功能的舊的且通常設(shè)計(jì)不完善且受支持的API。將這些函數(shù)的調(diào)用移到專(zhuān)用線程中以避免阻塞其他內(nèi)容是一種常見(jiàn)的做法。無(wú)法使此類(lèi)線程正常退出,因此使用of join只會(huì)導(dǎo)致主線程阻塞。在這種情況下,使用detach而不是thread用動(dòng)態(tài)存儲(chǔ)持續(xù)時(shí)間分配對(duì)象然后有意地泄漏對(duì)象的方法不太邪惡。
#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 關(guān)注
- 2593 瀏覽
添加回答
舉報(bào)