C 11多執行緒之future和promise

2021-10-20 18:40:58 字數 1649 閱讀 8352

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

假設執行緒1需要執行緒2的資料,那麼組合使用方式如下:

執行緒1初始化乙個promise物件和乙個future物件,promise傳遞給執行緒2,相當於執行緒2對執行緒1的乙個承諾;future相當於乙個接受乙個承諾,用來獲取未來執行緒2傳遞的值

執行緒2獲取到promise後,需要對這個promise傳遞有關的資料,之後執行緒1的future就可以獲取資料了。

如果執行緒1想要獲取資料,而執行緒2未給出資料,則執行緒1阻塞,直到執行緒2的資料到達。

std::future物件可以和asych,std::packaged_task,std::promise一起使用。這篇文章集中討論std::future和std::promise。

我們經常會遇到需要得到執行緒返回結果的情況,現在的問題是我們如何實現。

舉個例子:

假設在程式中,我們建立了乙個壓縮給定資料夾的執行緒,並且我們希望該執行緒能夠返回新的zip檔案的名稱和大小。

有兩種實現方式:

std::promisepromiseobj;
目前為止,該promise物件沒有任何管理的值,但它承諾肯定會有人對其進行賦值,一旦被賦值,就可以通過其管理的std::future物件來獲取該值。

但是,假設執行緒1建立了該promise物件並將其傳給執行緒2,那麼執行緒1怎樣知道執行緒2什麼時候會對promise物件進行賦值呢?

答案是使用std::future物件

每個std::promise物件都有個對應的std::future物件,其他人可以通過它來獲取promise設定的值。

所以,執行緒1將會建立std::promise物件,然後在將其傳遞給執行緒2之前從它那裡獲取std::future物件。

std::futurefutureobj = promiseobj.get_future();
現在,執行緒1將promiseobj傳遞給執行緒2.

那麼執行緒1將會獲取到執行緒2通過std::future的get函式設定在std::promise中的值,

int val = futureobj.get();
但是如果執行緒2還沒有對該值進行設定,那麼這個呼叫將會阻塞,直到執行緒2在promise物件中對該值進行設定。

promiseobj.set_value(45);
乙個簡單的說明流程:

簡單的**示例:

#include #include #include #include #include #include void thread_set_promise(std::promise& promiseobj) 

int main()

輸出結果:

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

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

C 11多執行緒之std lock guard

原文 std lock guard lock guard 類是乙個mutex封裝者,它為了擁有乙個或多個mutex而提供了一種方便的 raii style 機制。譯註 所謂的raii,全稱為resource acquisition is initialization,漢語是 資源獲取即初始化 但是這...

C 11多執行緒之mutex

mutex類是能用於保護共享資料免受從多個執行緒同時訪問的同步原語。mutex既不可複製亦不可移動。構造互斥。呼叫後互斥在未鎖定狀態。mutex 複製建構函式被刪除。mutex const mutex delete lock 鎖定互斥。若另一線程已鎖定互斥,則到lock的呼叫將阻塞執行,直至獲得鎖。...