C 11 執行緒庫 高層介面

2021-06-27 16:32:48 字數 1702 閱讀 4269

如今的cpu是朝著多核發展,在移動端的表現也是如此,4核甚至是8核cpu的手機都出來了。所以執行緒的作用就能充分利用多核的優勢,充分發掘手機的效能。

c++11也順應時代的潮流,在stl庫中增加了執行緒庫。但使用執行緒也會帶來一些問題。那就是不太好除錯,而且利用的不好會帶來data reaces和dead lock的問題。可能程式的執行與你的設想程式的執行不同。

但畢竟好處還是大於壞處,執行緒能在很大程度上帶來更好的使用者體驗。使你的主介面不會因為後台需要大量的計算或者一些費時的io操作而卡死。

在c+11中,有兩種使用執行緒的方法。分別叫做高層的介面和底層的介面。首先看一下高層的介面:

高層的介面是使用future,首先標頭檔案必須包含,在裡面提供的介面有:

在宣告執行緒的時候是使用這種方式的:future《返回值》 temp(async(...,函式名))這樣就宣告了乙個執行緒變數,執行緒的啟動的話是依靠函式async,但async的啟動執行緒的行為時高度複雜的並且依賴於async的第乙個引數。

async第乙個引數有兩種,

1 lanch::async,他會強制執行緒立即啟動,如果不能啟動,則會丟擲system_error的異常

2 lanch::deferred,這個引數並不會啟動執行緒,他會一直等到呼叫wait()或者是get()的時候才啟動執行緒,如果不呼叫這兩個成員函式,則執行緒一直不會啟動

如果需要向函式傳引數的話,則形式為 future《返回值》 temp(async(...,函式名,引數)),也可使用拉姆表示式(ar不太懂這個,以後學習一下)auto f1 = async();

在使用future的時候會有個限制,就是呼叫get的時候乙個執行緒只能呼叫一次,否則行為是未定義的。但有時候需要多次處理併發運算的結果,此時就需要多次呼叫get。為了解決這個問題,c++11標準庫提供了,shared_future類,

來處理這種需求。shared_future的用法如下:

shared_future《返回值》 temp(async((..,..,));

shared_future的返回值為:

const t& shared_future::get();

t& shared_future::get();

void shared_future::get();

也可以把shared_future<>傳引用傳給執行緒:

void dosomething(char c , const shared_future&f);

auto f = async(launch::async,dosomething,'.',std::ref(f));

根據c++11自修手冊上說的,「相比與使用多個shared_future物件去處理多個get的時候,你可能使用乙個共同的shared_future物件去處理,但這樣做會更加危險。」這句話不太理解,以後回來在看看。

在自修手冊上還說明了乙個東西,就是在使用執行緒的時候盡量使用區域性變數,即應該採用傳值的方式傳引數,如果拷貝物件的花費太大的時候,應該採用const 引用,保證執行緒使用的就是單獨的區域性變數。

上傳一下自己的試驗性**:

#include "stdafx.h"

#include "highlevel.h"

#include

#include

接下來是學習底層的執行緒介面。以後在寫了,今天太晚了!!!~_~!

c 11 執行緒支援庫 執行緒

c 支援庫 c 包含執行緒 互斥 條件變數和 的內建支援。class thread 類thread表示單個執行執行緒。執行緒允許多個函式併發執行。緊接著關聯的執行緒物件構造,執行緒開始執行 為任何 os 排程延遲懸掛 始於作為構造函式引數提供的頂層函式。忽略頂層函式的返回值,而且若它以拋異常終止,則...

c 11多執行緒庫

建立執行緒的四種方法 執行緒類的建構函式是變參建構函式,第乙個引數是執行緒函式,後面的引數為執行緒函式的引數 引數通過值傳遞方式,若要引用傳遞須加std ref thread t1 counter,1,6 void counter int,int class counter 實現 operator ...

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...