在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++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。