當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ std::promise用法及代碼示例


在C++多線程中,線程是可以在進程內執行的基本單位,為了使兩個或多個線程相互通信,可以使用std::promise和std::future結合使用。在本文中,我們將討論 C++ 中的 std::promise 以及如何在我們的程序中使用它。

C++ 中的 std::promise 是什麽?

std::promise 是與 std::future 類一起使用的類模板,它承諾設置可以在另一個線程中訪問的 std::future 對象的值。該方法的主要函數是為一個線程提供一種方法來履行承諾(設置一個值或異常),並為另一個線程提供一種方法,以便在稍後的時間點檢索該值或異常,從而定義未來的引用。

它通常對 producer-consumer 類型問題有幫助。

如何使用 std::promise?

要使用 std::promise,請包含 <future> 標頭並按照以下步驟操作:

  1. 創建一個 std::promise 對象:定義一個 Promise 類型的對象,它將保存將來設置的值。
  2. 創建一個 std::future 對象:使用 get_future() 成員函數創建一個與我們的 Promise 關聯的 future 對象,一旦設置了該值,它將用於訪問該值。
  3. 在 std::promise 中設置值:從生產者線程中,通過使用 Promise 設置相應的值來調用 Promise,我們可以使用 set_value() 設置值,或者使用 set_exception() 設置拋出的異常。
  4. 從 std::future 中檢索值:使用 std::future 從消費者線程獲取值get()future 函數來獲取關聯的值或獲取關聯的錯誤。

C++ 中 std::future 的示例

下麵的示例演示了如何使用“std::promise”和“std::future”在線程之間進行通信。

C++


// C++ program to use std::promise and std::future to 
// communicate between threads. 
#include <future> 
#include <iostream> 
#include <stdexcept> 
#include <thread> 
  
using namespace std; 
  
// Function to perform some computation and set the result 
// in a promise 
void RetrieveValue(promise<int>& result) 
{ 
    try { 
        int ans = 21095022; 
  
        // Set the result in the promise 
        result.set_value(ans); 
    } 
    catch (...) { 
        // if an error occurs set the exception 
        result.set_exception(current_exception()); 
    } 
} 
  
int main() 
{ 
    // Step 1: Creating a std::promise object 
    promise<int> myPromise; 
  
    // Step 2: Associate a std::future with the promise 
    future<int> myFuture = myPromise.get_future(); 
  
    // Step 3: Launching a thread to perform computation and 
    // set the result in the promise 
    thread computationThread(RetrieveValue, ref(myPromise)); 
  
    // Step 4: Retrieve the value or handle the exception in 
    // the original thread 
    try { 
        int result = myFuture.get(); 
        cout << "Result: " << result << endl; 
    } 
    catch (const exception& e) { 
        cerr << "Exception is: " << e.what() << endl; 
    } 
  
    // thread finishes 
    computationThread.join(); 
  
    return 0; 
}

輸出

Result: 21095022

解釋:在上麵的例子中,結果是 21095022,因為RetriveValue函數在promise中設置了值‘21095022’,而main()函數調用myFuture.get()來獲取相應的值,該值將打印‘21095022’,因為沒有錯誤被拋出。

結論

總之,可以使用 C++ 中的 “std::promise” 在 C++ 中完成並發編程。這與 “std::future” 一起是更廣泛的 C++11/14 並發函數的一部分。這是一種有用且簡單的方法,有助於數據傳輸,還允許我們處理異常。



相關用法


注:本文由純淨天空篩選整理自anushamahajan5大神的英文原創作品 std::promise in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。