第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

什么時(shí)候應(yīng)該使用std :: thread :: detach?

什么時(shí)候應(yīng)該使用std :: thread :: detach?

C++
SMILET 2019-11-11 14:12:23
有時(shí)我必須使用它std::thread來(lái)加速我的應(yīng)用程序。我也知道join()等到線程完成。這很容易理解,但是調(diào)用detach()和不調(diào)用有什么區(qū)別?我認(rèn)為,如果沒(méi)有detach(),線程的方法將單獨(dú)使用線程工作。不分離:void Someclass::Somefunction() {    //...    std::thread t([ ] {        printf("thread called without detach");    });    //some code here}調(diào)用與分離:void Someclass::Somefunction() {    //...    std::thread t([ ] {        printf("thread called with detach");    });    t.detach();    //some code here}
查看完整描述

3 回答

?
翻過(guò)高山走不出你

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


查看完整回答
反對(duì) 回復(fù) 2019-11-11
?
炎炎設(shè)計(jì)

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)用。


查看完整回答
反對(duì) 回復(fù) 2019-11-11
?
郎朗坤

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;

}


查看完整回答
反對(duì) 回復(fù) 2019-11-11
  • 3 回答
  • 0 關(guān)注
  • 2593 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)