主要有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可實現資料結構的無鎖設計。所謂的原子操作,取的就是 原子是最小的 不可分割的最小個體 的意義,它表示在多個執行緒訪問同乙個全域性資源的時候...