C 11多執行緒 執行緒結果future

2021-10-12 16:06:24 字數 2337 閱讀 7298

先用std::async啟動乙個非同步任務,它返回乙個持有計算結果的std::future,通過std::future::get即可阻塞執行緒,直到期值的狀態為ready並返回該結果

intf(

)int

main()

intf(

);// 函式必須非同步執行,即執行在不同的執行緒上

auto ft1 = std::

async

(std::launch::async, f)

;// 函式只在返回的期值呼叫get或wait時執行

auto ft2 = std::

async

(std::launch::deferred, f)

;// 不指定時的預設啟動策略是對兩者進行或運算的結果

// auto ft3 = std::async(f)等價於

auto ft3 = std::

async

(std::launch::async | std::launch::deferred, f)

;

packaged_task類模板也是定義於future標頭檔案中,它包裝任何可呼叫 (callable) 目標,包括函式、 lambda 表示式、 bind 表示式或其他函式物件,使得能非同步呼叫它,其返回值或所拋異常被儲存於能通過 std::future 物件訪問的共享狀態中。簡言之,將乙個普通的可呼叫函式物件轉換為非同步執行的任務。通過packaged_task包裝後,可以通過thread啟動或者仿函式形式啟動,其執行結果返回值或所拋異常被儲存於能通過 std::future 物件訪問的共享狀態中。

#include

// std::cout

#include

// std::thread

#include

#include

using

namespace std;

//普通函式

intadd

(int x,

int y)

void

task_lambda()

);//仿函式形式,啟動任務

task(2

,10);

//獲取共享狀態中的值,直到ready才能返回結果或者異常

future<

int> result = task.

get_future()

; cout <<

"task_lambda :"

<< result.

get(

)<<

"\n";}

void

task_thread()

intmain

(int argc,

char

*ar**)

乙個std::promise只能關聯乙個std::future,關聯多次時將丟擲std::future_error異常

std::promise<

int> ps;

std::future<

int> ft = ps.

get_future()

;ps.

set_value(42

);// set_value還會將狀態設定為就緒

std::cout << ft.

get();

// 42

void

f(std::promise<

void

> ps)

intmain()

//第一種

std::promise<

int> ps;

std::future<

int>

ft(ps.

get_future()

);std::shared_future<

int>

sf(std::

move

(ft));

//第二種

// std::future隱式轉換為std::shared_future

std::promise<

int> ps;

std::shared_future<

int>

sf(ps.

get_future()

);//第三種

std::promise<

int> ps;

auto sf = ps.

get_future()

.share()

;

1.

2.

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