啟動乙個執行緒
#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.初...