c 11 多執行緒一 多執行緒應用

2022-03-26 06:49:54 字數 3367 閱讀 8875

c++98標準中並沒有執行緒庫的存在,而在c++11中終於提供了多執行緒的標準庫,提供了管理執行緒、保護共享資料、執行緒間同步操作、原子操作等類。

多執行緒庫對應的標頭檔案是#include,類名為std::thread

例子:

#include #include 

void

function_1()

intmain()

join呼叫,則會阻塞主線程(呼叫者)

首先,構建乙個std::thread物件t1,構造的時候傳遞了乙個引數,這個引數是乙個函式,這個函式就是這個執行緒的入口函式,函式執行完了,整個執行緒也就執行完了。

執行緒建立成功後,就會立即啟動,並沒有乙個類似start的函式來顯式的啟動執行緒。

一旦執行緒開始執行, 就需要顯式的決定是要等待它完成(join),或者分離它讓它自行執行(detach)。注意:只需要在std::thread物件被銷毀之前做出這個決定。這個例子中,物件t1是棧上變數,在main函式執行結束後就會被銷毀,所以需要在main函式結束之前做決定。

這個例子中選擇了使用t1.join(),主線程會一直阻塞著,直到子執行緒完成,join()函式的另乙個任務是**該執行緒中使用的資源。

執行緒物件和物件內部管理的執行緒的生命週期並不一樣,如果執行緒執行的快,可能內部的執行緒已經結束了,但是執行緒物件還活著,也有可能執行緒物件已經被析構了,內部的執行緒還在執行。

被分離之後,即使該執行緒物件被析構了,執行緒還是能夠在後台執行,只是由於物件被析構了,主線程不能夠通過物件名與這個執行緒進行通訊。例如:

#include #include 

void

function_1()

void

test()

intmain()

由於執行緒入口函式內部有個500ms的延時,所以在還沒有列印的時候,test()已經執行完成了,t1已經被析構了,但是它負責的那個執行緒還是能夠執行,這就是detach()的作用。

如果去掉main函式中的1s延時,會發現什麼都沒有列印,因為主線程執行的太快,整個程式已經結束了,那個後台執行緒被c++執行時庫**了。

如果將t1.detach()換成t1.join()test函式會在t1執行緒執行結束之後,才會執行結束。

一旦乙個執行緒被分離了,就不能夠再被join了。如果非要呼叫,程式就會崩潰,可以使用joinable()函式判斷乙個執行緒物件能否呼叫join()

void

test()

std::thread類的建構函式是使用可變引數模板實現的,也就是說,可以傳遞任意個引數,第乙個引數是執行緒的入口函式,而後面的若干個引數是該函式的引數

第一引數的型別並不是c語言中的函式指標(c語言傳遞函式都是使用函式指標),在c++11中,增加了可呼叫物件(callable objects)的概念,總的來說,可呼叫物件可以是以下幾種情況:

對於執行緒t1來說,內部呼叫的執行緒函式其實是乙個副本,所以如果在函式內部修改了類成員,並不會影響到外面的物件。只有傳遞引用的時候才會修改。所以在這個時候就必須想清楚,到底是傳值還是傳引用!

函式指標

typedef void (*pfunction)();

pfunction pf;

void

myprint()

intmain()

仿函式

class

fctor

};int

main()

lambda表示式

int

main() );

t.join();

std::getchar();

return0;

}

function和函式指標類似

functionfun;

void

myprint()

intmain()

std::thread t(&threadtest::mythread,this,param1,param2);

執行緒物件之間是不能複製的,只能移動,移動的意思是,將執行緒的所有權在std::thread例項間進行轉移。

void

some_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 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...