C 11併發程式設計 01(執行緒的啟動 傳參)

2021-08-08 01:34:36 字數 2644 閱讀 8202

啟動乙個執行緒

#include 

#include

int main()

); mythread.join();

return

0;}

執行結果:

thread starting…

this is a new thread!

要點:

std::thread的構造可傳入一切callable物件,如: 普通函式、lambda、函式指標、bind物件、擁有()符號過載的函式物件。

你一定要確保在std::thread物件被銷毀前(而不是執行緒結束前)顯式地呼叫std::thread物件的 join 或 detach方法。

std::thread物件被銷毀並不代表執行緒一定結束了。特別是當你呼叫了detach之後,當該thread物件被銷毀,執行緒很可能還在執行中。

如果你呼叫detach分離執行緒,那麼應當確保執行緒所需要訪問的資料是有效的。 特別注意區域性變數。

join的作用是當前執行緒等待其對應的子執行緒結束之後才會結束,可以有效防止子執行緒對區域性變數的依賴風險。detach的作用是將指定的子執行緒從當前執行緒中分離,當前執行緒不再等待該執行緒執行完畢才結束,同時相當於是放棄了對該執行緒的控制權,再也無法獲得該執行緒的物件並對其進行通訊或控制。

join 會阻塞主(父)執行緒的執行,考慮以下**:

#include 

#include

#include

int main()

); thread1.join();

std:

:thread thread2();

thread2.join();

std:

:cout<<"after join"

;

return

0;}

當main輸出after join時,實際上等待了6秒,即 thread1.join() 阻塞主線程等待thread1執行完成後才開始向下執行。

#include 

#include

#include

int main()

); std:

:thread thread2();

thread1.join();

thread2.join();

std:

:cout<<"after join"

;

return

0;}

把thread1.join()放到thread2.join()之前則 main輸出after join時總共只等待了3秒。以上例子同時還說明了std::thread的執行實際上在thread物件構造的時候就已經開始,而不是等到join或者detach被呼叫才開始(但並不保證構造語句執行後執行緒就一定成功跑起來了,有可能會延時)。

給新執行緒傳遞引數

實際上就是給thread物件繫結的函式傳遞引數:

#include 

#include

#include

#include

#include

std::mutex g_mutex;

int main()

; std::thread thread1(func,1);

std::thread thread2(func,2);

thread1.join();

thread2.join();

std::cout

<<"after join";

return

0;}

執行結果:

thread1 started

thread1 end!

thread2 started

thread2 end!

after join

給執行緒傳遞引用

以下**編譯會報錯:

#include 

#include

using

namespace

std;

foo(int& val)

int main()

原因是c++缺省會把執行緒實參進行拷貝,即在子執行緒中訪問到的引用實際上已經是副本的引用,依然改變不了原變數,所以這是沒有意義的。筆者目前的編譯器版本(gcc version 4.9.2)會對以上**報錯。

解決方案是 對實參加上 std::ref();

#include 

#include

using

namespace

std;

foo(int& val)

int main()

即可完美執行。

C 11併發程式設計 多執行緒std thread

c 11引入了thread類,大大降低了多執行緒使用的複雜度,原先使用多執行緒只能用系統的api,無法解決跨平台問題,一套 平台移植,對應多執行緒 也必須要修改。現在在c 11中只需使用語言層面的thread可以解決這個問題。所需標頭檔案 thread noexcept 乙個空的std thread...

C 11 多執行緒 併發程式設計總結

建立std thread,一般會繫結乙個底層的執行緒。若該thread還繫結好函式物件,則即刻將該函式執行於thread的底層執行緒。執行緒相關的很多預設是move語義,因為在常識中線程複製是很奇怪的行為。joinable 是否可以阻塞至該thread繫結的底層執行緒執行完畢 倘若該thread沒有...

C 11併發程式設計 多執行緒std thread

一 概述 c 11引入了thread類,大大降低了多執行緒使用的複雜度,原jtpbyn先使用多執行緒只能用系統的api,無法解決跨平台問題,一套 平台移植,對應多執行緒 也必須要修改。現在在c 11中只需使用語言層面的thread可以解決這個問題。所需標頭檔案 二 建構函式 1.預設建構函式 2.初...