C 11 非同步操作

2021-08-19 17:25:40 字數 1981 閱讀 9909

主要有std::future、std::promise和std::package_task。

std::future作為非同步結果的傳輸通道,可以很方便的獲取執行緒函式的返回值。

std::promise用來包裝乙個值,將資料和future繫結起來,方便執行緒賦值。

std::package_task用來包裝乙個可呼叫物件,將函式和future繫結起來以便非同步呼叫。

最後還有執行緒非同步操作函式async。

future and promise

std:

:promise pr;

std:

:thread t((std:

:promise& p)

, std:

:ref(pr));

std:

:future f = pr.get_future();

auto res = f.get();

cout << "res:"

<< res << endl;

package_task
//packaged_task相當於封裝了promise 以及操作promise的函式

std::packaged_task task(() );

std::thread tt(std::ref(task));

std::future ff = task.get_future();

//std::shared_futureff = task.get_future();

auto rr = ff.get(); //阻塞當前執行緒等待執行結果

cout

<< "res:"

<< rr << endl;

獲取future的結果有多種方式:get、wait和wait_for,其中get是等待非同步操作並返回結果,wait只是等待非同步操作完成沒有返回值,wait_for是超時等待返回結果。

async

它可以直接建立非同步task,並且非同步task的返回結果依舊保持在future中。

使用例項如下:

std:

:future f1 = std:

:async(std:

:launch

::async,() );

cout << f1.get() << endl;

std:

:future f2 = std:

:async(std:

:launch

::async, () );

f2.wait();

std:

:future f3 = std:

:async(std:

:launch

::async, () );

cout << "waiting..."

<< endl;

std:

:future_status status; //查詢狀態以便得到當前執行狀態

do else

if (status == std:

:future_status

::timeout)

else

if (status == std:

:future_status

::ready)

} while (status != std:

:future_status

::ready);

cout << "res:"

<< f3.get() << endl;

std::launch::async該值含義是,在呼叫async時就開始建立執行緒。

std::launch::deferred:延遲載入方式,直到呼叫future的get或者wait函式才會建立執行緒。

C11執行緒管理 非同步操作

c 11提供了非同步操作相關的類,std future std promise和std package task。std future作為非同步結果的傳輸通道,方便的獲取執行緒函式的返回值 std promise用來包裝乙個值,將資料和future繫結起來,方便執行緒賦值 std pack age用...

深入應用C 11 筆記 非同步操作 (九)

c 11 提供了非同步操作相關的類 std future作為非同步結果的傳輸通道,用於獲取執行緒函式的的返回值 std promise用於包裝乙個值,將資料和future繫結起來,方便執行緒賦值 std package task將函式和future繫結起來,以便非同步呼叫。1.1 獲取執行緒函式返回...

C 11之atomic原子操作

atomic對int char bool等資料結構進行了原子性封裝,在多執行緒環境中,對std atomic物件的訪問不會造成競爭 冒險。利用std atomic可實現資料結構的無鎖設計。所謂的原子操作,取的就是 原子是最小的 不可分割的最小個體 的意義,它表示在多個執行緒訪問同乙個全域性資源的時候...