這篇文章給大家介紹如何在C++11/14 中創(chuàng)建線程與分離線程,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
“專業(yè)、務(wù)實(shí)、高效、創(chuàng)新、把客戶的事當(dāng)成自己的事”是我們每一個(gè)人一直以來堅(jiān)持追求的企業(yè)文化。 成都創(chuàng)新互聯(lián)公司是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、軟件開發(fā)、設(shè)計(jì)服務(wù)業(yè)務(wù)。我們始終堅(jiān)持以客戶需求為導(dǎo)向,結(jié)合用戶體驗(yàn)與視覺傳達(dá),提供有針對(duì)性的項(xiàng)目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場(chǎng),引領(lǐng)市場(chǎng)!線程的創(chuàng)建
讓我們看看示例代碼(t1.cpp).
#include#include void thread_function() { std::cout << "thread function\n"; } int main() { std::thread t(&thread_function); // 線程 t 開始運(yùn)行 std::cout << "main thread\n"; t.join(); // 主線程等待子線程結(jié)束 return 0; }
代碼在linux系統(tǒng)下將輸出:
$ g++ t1.cpp -o t1 -std=c++11 -pthread $ ./t2 thread function main thread
我們要做的第一件事是創(chuàng)建一個(gè)線程對(duì)象(工作線程),并給它一個(gè)函數(shù)形式的任務(wù)進(jìn)行工作。
主線程希望等待線程成功完成。
所以,我們使用join(). 如果最初的主線程不等待新線程執(zhí)行完成,那么它會(huì)繼續(xù)執(zhí)行main()函數(shù)之后的代碼,可能在新線程執(zhí)行完畢前結(jié)束程序。
當(dāng)主線程在等待時(shí),主線程處于空閑狀態(tài)。
實(shí)際上,操作系統(tǒng)可能會(huì)把CPU資源從主線程上移走。
請(qǐng)注意,我們?cè)诰€程的函數(shù)和類的聲明中有一個(gè)新的標(biāo)準(zhǔn)C++庫(kù)頭文件#include
。
下圖是流程的流程圖
然而,在實(shí)際執(zhí)行中,事情并不是那么理想,更可能是不對(duì)稱的。也許,它看起來更像下面這張圖片。
當(dāng)工作線程開始構(gòu)造std::thread t的時(shí)候,可能會(huì)有創(chuàng)建時(shí)的開銷(通過使用線程池可以減少此開銷),圖中虛線表示可能的阻塞狀態(tài)。
線程的分離
我們可以創(chuàng)建一個(gè)新線程使其運(yùn)行為自由的守護(hù)進(jìn)程。
// t2.cpp int main() { std::thread t(&thread;_function); std::cout << "main thread\n"; // t.join(); t.detach(); return 0; }
分離的子線程現(xiàn)在是自由的,并自行運(yùn)行。它變成了一個(gè)守護(hù)進(jìn)程。
$ g++ t2.cpp -o t2 -std=c++11 -pthread $ ./t2 main thread
注意,分離線程沒有改變打印輸出到標(biāo)準(zhǔn)輸出stdout,因?yàn)橹骶€程已經(jīng)結(jié)束并退出。
這是多線程編程的特點(diǎn)之一:我們不能確定哪個(gè)線程首先運(yùn)行 (不確定性,除非我們使用同步機(jī)制。). 在我們的例子中,由于創(chuàng)建一個(gè)新線程需要一定的時(shí)間,主線程最有可能比子線程率先執(zhí)行完畢。
還有一點(diǎn)我們需要注意的是,即使在這個(gè)簡(jiǎn)單的代碼中,我們也在共享一個(gè)公共資源:std::cout。
因此,為了使代碼正常工作,主線程應(yīng)該允許我們的子線程訪問資源。
一旦一個(gè)線程分離,我們不能強(qiáng)迫它與主線程重新連接。因此,下面的代碼行是錯(cuò)誤的,程序會(huì)崩潰。
int main() { std::thread t(&thread;_function); std::cout << "main thread\n"; // t.join(); t.detach(); t.join(); // Error return 0; }
一旦脫離,線程就應(yīng)該永遠(yuǎn)是脫離狀態(tài).
我們可以使用joinable()把代碼做崩潰前的檢查。
因?yàn)樗黬oinable()返回為false,join()函數(shù)不會(huì)被調(diào)用,程序運(yùn)行不會(huì)崩潰。
int main() { std::thread t(&thread;_function); std::cout << "main thread\n"; // t.join(); if(t.joinable()) t.join(); return 0; }
關(guān)于如何在C++11/14 中創(chuàng)建線程與分離線程就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。