在C++多線程中,線程是可以在進程內執行的基本單位,為了使兩個或多個線程相互通信,可以使用std::promise和std::future結合使用。在本文中,我們將討論 C++ 中的 std::promise 以及如何在我們的程序中使用它。
C++ 中的 std::promise 是什麽?
std::promise 是與 std::future 類一起使用的類模板,它承諾設置可以在另一個線程中訪問的 std::future 對象的值。該方法的主要函數是為一個線程提供一種方法來履行承諾(設置一個值或異常),並為另一個線程提供一種方法,以便在稍後的時間點檢索該值或異常,從而定義未來的引用。
它通常對 producer-consumer 類型問題有幫助。
如何使用 std::promise?
要使用 std::promise,請包含 <future> 標頭並按照以下步驟操作:
- 創建一個 std::promise 對象:定義一個 Promise 類型的對象,它將保存將來設置的值。
- 創建一個 std::future 對象:使用 get_future() 成員函數創建一個與我們的 Promise 關聯的 future 對象,一旦設置了該值,它將用於訪問該值。
- 在 std::promise 中設置值:從生產者線程中,通過使用 Promise 設置相應的值來調用 Promise,我們可以使用 set_value() 設置值,或者使用 set_exception() 設置拋出的異常。
- 從 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 並發函數的一部分。這是一種有用且簡單的方法,有助於數據傳輸,還允許我們處理異常。
相關用法
- C++ std::prev用法及代碼示例
- C++ std::partial_sort用法及代碼示例
- C++ std::partial_sort_copy用法及代碼示例
- C++ std::partition用法及代碼示例
- C++ std::plus用法及代碼示例
- C++ std::accumulate()用法及代碼示例
- C++ std::binary_search()用法及代碼示例
- C++ std::copy()用法及代碼示例
- C++ std::copy_if()用法及代碼示例
- C++ std::copy_n()用法及代碼示例
- C++ std::fill()用法及代碼示例
- C++ std::fill_n()用法及代碼示例
- C++ std::find()用法及代碼示例
- C++ std::find_first_of()用法及代碼示例
- C++ std::for_each()用法及代碼示例
- C++ std::lower_bound()用法及代碼示例
- C++ std::max()用法及代碼示例
- C++ std::max_element()用法及代碼示例
- C++ std::min()用法及代碼示例
- C++ std::min_element()用法及代碼示例
- C++ std::minmax()用法及代碼示例
- C++ std::next_permutation()用法及代碼示例
- C++ std::nth_element()用法及代碼示例
- C++ std::replace()用法及代碼示例
- C++ std::replace_copy()用法及代碼示例
注:本文由純淨天空篩選整理自anushamahajan5大神的英文原創作品 std::promise in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。