c 11 多線執行緒 future

2021-08-18 18:57:20 字數 3853 閱讀 9849

std::promise 類介紹

promise 物件可以儲存某一型別 t 的值,該值可被 future 物件讀取(可能在另外乙個執行緒中),因此 promise 也提供了一種執行緒同步的手段。在 promise 物件構造時可以和乙個共享狀態(通常是std::future)相關聯,並可以在相關聯的共享狀態(std::future)上儲存乙個型別為 t 的值。

可以通過 get_future 來獲取與該 promise 物件相關聯的 future 物件,呼叫該函式之後,兩個物件共享相同的共享狀態(shared state)

promise 物件是非同步 provider,它可以在某一時刻設定共享狀態的值。

future 物件可以非同步返回共享狀態的值,或者在必要的情況下阻塞呼叫者並等待共享狀態標誌變為 ready,然後才能獲取共享狀態的值。

下面以乙個簡單的例子來說明上述關係

// promise example  

#include // std::cout

#include // std::ref

#include // std::thread

#include // std::promise, std::future

void print_int(std::future& fut)

int main()

std::promise 類的建構函式講解

另外,std::promise 的 operator= 沒有拷貝語義,即 std::promise 普通的賦值操作被禁用,operator= 只有 move 語義,所以 std::promise 物件是禁止拷貝的。

// promise constructors  

#include // std::cout

#include // std::ref

#include // std::allocator, std::allocator_arg

#include // std::thread

#include // std::promise, std::future

void print_int(std::future& fut)

int main()

std::promise::get_future 介紹

該函式返回乙個與 promise 共享狀態相關聯的 future 。返回的 future 物件可以訪問由 promise 物件設定在共享狀態上的值或者某個異常物件。只能從 promise 共享狀態獲取乙個 future 物件。在呼叫該函式之後,promise 物件通常會在某個時間點準備好(設定乙個值或者乙個異常物件),如果不設定值或者異常,promise 物件在析構時會自動地設定乙個 future_error 異常(broken_promise)來設定其自身的準備狀態。上面的例子中已經提到了 get_future,此處不再重複。

std::promise::set_exception 介紹

為 promise 設定異常,此後 promise 的共享狀態變標誌變為 ready,例子如下,執行緒1從終端接收乙個整數,執行緒2將該整數列印出來,如果執行緒1接收乙個非整數,則為 promise 設定乙個異常(failbit) ,執行緒2 在std::future::get 是丟擲該異常。

看乙個例子:

#include // std::cin, std::cout, std::ios  

#include // std::ref

#include // std::thread

#include // std::promise, std::future

#include // std::exception, std::current_exception

void get_int(std::promise& prom)

catch (std::exception&)

} void print_int(std::future& fut)

catch (std::exception& e)

} int main()

簡單來說,std::future提供了一種訪問非同步操作結果的機制。

從字面意思看,它表示未來。通常乙個非同步操作我們是不能馬上就獲取操作結果的,只能在未來某個時候獲取。我們可以以同步等待的方式來獲取結果,可以通過查詢future的狀態(future_status)來獲取非同步操作的結果。future_status有三種狀態:

deferred:非同步操作還沒開始

ready:非同步操作已經完成

timeout:非同步操作超時

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

//查詢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);

promise物件可儲存t型別的值,該值可被future物件讀取(可能在另乙個執行緒中),這是promise提供同步的一種手段。在構造promise時,promise物件可以與共享狀態關聯起來,這個共享狀態可以儲存乙個t型別或者乙個由std::exception派生出的類的值,並可以通過get_future來獲取與promise物件關聯的物件,呼叫該函式之後,兩個物件共享相同的共享狀態(shared state)。

promise物件是非同步provider,它可以在某一時刻設定共享狀態的值。

future物件可以返回共享狀態的值,或者在必要的情況下阻塞呼叫者並等待共享狀態標識變為ready,然後才能獲取共享狀態的值。

#include // std::cout

#include // std::ref

#include // std::thread

#include // std::promise, std::future

void print_int(std::future& fut)

int main ()

成員函式

std::packaged_task包裝了乙個可呼叫的目標(如function, lambda expression, bind expression, or another function object),以便非同步呼叫,它和promise在某種程度上有點像,promise儲存了乙個共享狀態的值,而packaged_task儲存的是乙個函式。

小結promise,future 和 callback常常作為併發程式設計中一組非阻塞的模型。其中 future 表示乙個可能還沒有實際完成的非同步任務的【結果】,針對這個結果可以新增 callback 以便在任務執行成功或失敗後做出對應的操作,而 promise 交由任務執行者,任務執行者通過 promise 可以標記任務完成或者失敗。

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

先用std async啟動乙個非同步任務,它返回乙個持有計算結果的std future,通過std future get即可阻塞執行緒,直到期值的狀態為ready並返回該結果 intf int main intf 函式必須非同步執行,即執行在不同的執行緒上 auto ft1 std async st...

C 11多執行緒之future和promise

std future和promise的作用是在不同執行緒之間傳遞資料。使用指標也可以完成資料的傳遞,但是指標非常危險,因為互斥量不能阻止指標的訪問 而且指標的方式傳遞的資料是固定的,如果更改資料型別,那麼還需要更改有關的介面,比較麻煩 promise支援泛型的操作,更加方便程式設計處理。假設執行緒1...

c 11新特性之future

std future可以從非同步任務中獲取結果,一般與std async配合使用,std async用於建立非同步任務,實際上就是建立乙個執行緒執行相應任務。先看段 include include include bool is prime int x return true intmain std...