亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候應該使用std :: thread :: detach?

什么時候應該使用std :: thread :: detach?

C++
SMILET 2019-11-11 14:12:23
有時我必須使用它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}
查看完整描述

3 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

在的析構函數中std::thread,std::terminate如果發生以下情況,則稱為:


線程未加入(帶有t.join())

并且也未與(分離t.detach())

因此,你應該總是要么join還是detach一個線程執行的流之前到達析構函數。


當程序終止(即main返回)時,不會等待在后臺執行的其余分離線程;相反,它們的執行被掛起,并且它們的線程本地對象被破壞。


至關重要的是,這意味著不會解開那些線程的堆棧,因此不會執行某些析構函數。根據那些破壞者應該采取的行動,情況可能像程序崩潰或被殺死一樣糟糕。希望操作系統將釋放文件等上的鎖,但是您可能損壞了共享內存,半寫文件等。


因此,您應該使用join還是detach?


采用 join

除非您需要更大的靈活性并且愿意提供同步機制來獨自等待線程完成,否則您可以使用detach


查看完整回答
反對 回復 2019-11-11
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

detach如果您不打算等待線程完成,則應調用,join而線程將一直運行直到完成,然后終止而不必讓主線程專門等待它。


detach基本上會釋放能夠實施所需的資源join。


這是一個致命的錯誤,如果一個線程對象結束其生命,并沒有join,也不detach曾被稱為; 在這種情況下terminate被調用。


查看完整回答
反對 回復 2019-11-11
?
郎朗坤

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;

}


查看完整回答
反對 回復 2019-11-11
  • 3 回答
  • 0 關注
  • 2607 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號