当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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