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

2021-08-21 05:59:28 字數 2382 閱讀 8312

c++11 提供了非同步操作相關的類:

*std::future作為非同步結果的傳輸通道,用於獲取執行緒函式的的返回值;

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

*std::package_task將函式和future繫結起來,以便非同步呼叫。

1.1 獲取執行緒函式返回值的類std::future

​ thread庫提供了future用來訪問非同步操作的結果,因為乙個非同步操作的結果不能馬上獲取,只能在未來某個時候從某個地方獲取,這個非同步操作的結果是乙個未來的期待值,所以被稱為future,future提供了獲取非同步操作結果的通道。可以以同步等待的方式獲取結果,可以通過查詢future的狀態(future_status)來獲取非同步操作的結果。future_status有如下3種狀態:

我們可以查詢future狀態,通過它內部的狀態可以知道非同步任務的執**況:

//查詢future的狀態

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);

獲取future結果有三種方式:

1.2 協助執行緒賦值的類 std::promise

std:

:promise pr;

std:

:thread t((std:

:promise &p),std:

:ref(pr));

std:

:future f=pr.get_future();

auto f=f.get();

1.3 可呼叫物件的包裝類std::packaged_task

​ std::packaged_task包裝了乙個可呼叫物件的包裝類(如function、lambda expression、bind expression和another function object),將函式和future繫結起來,以便非同步呼叫,它和std::promise在某種程度上有點像,promise儲存了乙個共享狀態的值,而packaged_task儲存的是乙個函式。

std:

:packaged_task()> task(());

std:

:thread t1(std:

:ref(task));

std:

:future f1=task.get_future();

auto r1=f1.get();

1.4 std::promise、std::packaged_task和std::future三者之間的關係

​ std::future提供了乙個訪問非同步操作結果的機制,它和執行緒是乙個級別的,屬於低層次的物件。std::promise和std::packaged_task,它們內部都有future以便訪問非同步操作結果,std::packaged_task包裝的是乙個非同步操作,而std::promise包裝的是乙個值,都是為了方便非同步操作的返回值。

//packaged_task::get_future

#include

#include

#include

#include

#include

#include

#include

#include

namespace parallel}}

);}

/* **執行緒資源 */

for (auto &th : threads)

th.join();

}/* 通過std::promise::get_future獲得std::future物件,然後呼叫get獲取結果 */

return done ? result.get_future().get() : last;

}} int main()

);auto value = std::random_device()() % 65536;

auto it1 = parallel::find(v.begin(), v.end(), value);

auto it2 = std::find(v.begin(), v.end(), value);

assert(it1 == it2);

return

0; }

深入應用C 11 筆記(四)

1.8 tupe元組 構造tuple 標頭檔案為 使用make tuple 構造乙個tuple char sendpack int nsendsize tuple char int tp make tuple sendpack,nsendsize 使用std tie構造 tuple char int...

深入理解C 11 筆記

include using namespace std classa a 對於含有堆記憶體的類,需要提供深拷貝的拷貝建構函式,避免預設的拷貝構造使用淺拷貝導致堆記憶體的重複刪除。a const a a m ptr new int a.m ptr 通過移動構造,a 作為函式引數,只使用淺拷貝避免臨時物...

c 11 筆記,c 筆記

find if的使用 bool isthe const string s1 vectora auto aaa find if a.begin a.end isthe aaa為第乙個符合要求的位址。aaa為取到的值。aaa為迭代器 lambda 表示式 auto f cout auto aaa fin...