c++98
標準中並沒有執行緒庫的存在,而在c++11
中終於提供了多執行緒的標準庫,提供了管理執行緒、保護共享資料、執行緒間同步操作、原子操作等類。
多執行緒庫對應的標頭檔案是#include
,類名為std::thread
。
例子:
#include #includevoid
function_1()
intmain()
join呼叫,則會阻塞主線程(呼叫者)
首先,構建乙個std::thread
物件t1
,構造的時候傳遞了乙個引數,這個引數是乙個函式,這個函式就是這個執行緒的入口函式,函式執行完了,整個執行緒也就執行完了。
執行緒建立成功後,就會立即啟動,並沒有乙個類似start
的函式來顯式的啟動執行緒。
一旦執行緒開始執行, 就需要顯式的決定是要等待它完成(join),或者分離它讓它自行執行(detach)。注意:只需要在std::thread
物件被銷毀之前做出這個決定。這個例子中,物件t1
是棧上變數,在main
函式執行結束後就會被銷毀,所以需要在main
函式結束之前做決定。
這個例子中選擇了使用t1.join()
,主線程會一直阻塞著,直到子執行緒完成,join()
函式的另乙個任務是**該執行緒中使用的資源。
執行緒物件和物件內部管理的執行緒的生命週期並不一樣,如果執行緒執行的快,可能內部的執行緒已經結束了,但是執行緒物件還活著,也有可能執行緒物件已經被析構了,內部的執行緒還在執行。
被分離之後,即使該執行緒物件被析構了,執行緒還是能夠在後台執行,只是由於物件被析構了,主線程不能夠通過物件名與這個執行緒進行通訊。例如:
#include #includevoid
function_1()
void
test()
intmain()
由於執行緒入口函式內部有個500ms
的延時,所以在還沒有列印的時候,test()
已經執行完成了,t1
已經被析構了,但是它負責的那個執行緒還是能夠執行,這就是detach()
的作用。
如果去掉main
函式中的1s
延時,會發現什麼都沒有列印,因為主線程執行的太快,整個程式已經結束了,那個後台執行緒被c++
執行時庫**了。
如果將t1.detach()
換成t1.join()
,test
函式會在t1
執行緒執行結束之後,才會執行結束。
一旦乙個執行緒被分離了,就不能夠再被join
了。如果非要呼叫,程式就會崩潰,可以使用joinable()
函式判斷乙個執行緒物件能否呼叫join()
。
voidtest()
std::thread
類的建構函式是使用可變引數模板實現的,也就是說,可以傳遞任意個引數,第乙個引數是執行緒的入口函式,而後面的若干個引數是該函式的引數。
第一引數的型別並不是c
語言中的函式指標(c
語言傳遞函式都是使用函式指標),在c++11
中,增加了可呼叫物件(callable objects)的概念,總的來說,可呼叫物件可以是以下幾種情況:
對於執行緒t1
來說,內部呼叫的執行緒函式其實是乙個副本,所以如果在函式內部修改了類成員,並不會影響到外面的物件。只有傳遞引用的時候才會修改。所以在這個時候就必須想清楚,到底是傳值還是傳引用!
函式指標
typedef void (*pfunction)();pfunction pf;
void
myprint()
intmain()
仿函式
classfctor
};int
main()
lambda表示式
intmain() );
t.join();
std::getchar();
return0;
}
function和函式指標類似
functionfun;void
myprint()
intmain()
std::thread t(&threadtest::mythread,this,param1,param2);
執行緒物件之間是不能複製的,只能移動,移動的意思是,將執行緒的所有權在std::thread
例項間進行轉移。
voidsome_function();
void
some_other_function();
std::thread t1(some_function);
//std::thread t2 = t1;
//編譯錯誤
std::thread t2 = std::move(t1); //
只能移動 t1內部已經沒有執行緒了
t1 = std::thread(some_other_function); //
臨時物件賦值 預設就是移動操作
std::thread t3;
t3 = std::move(t2); //
t2內部已經沒有執行緒了
t1 = std::move(t3); //
程式將會終止,因為t1內部已經有乙個執行緒在管理了
多執行緒一----多執行緒的應用
多執行緒二----簡單執行緒管理
多執行緒三----資料競爭和互斥物件
多執行緒四----死鎖和防止死鎖
多執行緒五----unick_lock和once_flag
多執行緒六----條件變數
多執行緒七----執行緒間通訊
C 11 多執行緒
新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...
c 11 多執行緒
1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...
C 11 多執行緒
2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...