问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

std::future和std::promise详解

创作时间:
作者:
@小白创作中心

std::future和std::promise详解

引用
CSDN
1.
https://m.blog.csdn.net/xie__jin__cheng/article/details/144624212


概要

std::futurestd::promise 是 C++11 引入的标准库组件,用于实现线程间的同步和通信。它们提供了一种机制,允许一个线程设定某个值(通过 std::promise),而另一个线程可以等待这个值并获取它(通过 std::future)。这在线程间传递结果或异常时非常有用。

内容

std::promise

std::promise 用于设置一个共享状态的值,这个值可以在将来被 std::future 获取。主要成员函数有:

  • set_value(T value):设置共享状态的值。
  • set_exception(std::exception_ptr e):设置共享状态的异常。
  • get_future():返回一个与 std::promise 共享状态的 std::future 对象。

std::future

std::future 用于访问共享状态的值或异常。主要成员函数有:

  • get():获取共享状态的值。如果值还未被设置,则阻塞直到值被设置。如果共享状态存储了一个异常,则 get() 会重新抛出这个异常。
  • wait():阻塞直到共享状态的值被设置或存储了一个异常。
  • wait_for(duration):阻塞直到指定的时间段过去或共享状态的值被设置。
  • wait_until(time_point):阻塞直到指定的时间点或共享状态的值被设置。
  • valid():检查 std::future 是否有共享状态。

使用示例

以下是一个简单的示例,展示了如何使用 std::promisestd::future 在线程间传递结果:

#include <iostream>
#include <thread>
#include <future>

void threadFunction(std::promise<int> promiseObj) {
    std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟一些工作
    promiseObj.set_value(10); // 设置共享状态的值
}

int main() {
    // 创建一个 promise 对象
    std::promise<int> promiseObj;
    
    // 获取与 promise 共享状态的 future 对象
    std::future<int> futureObj = promiseObj.get_future();
    
    // 创建一个线程并传递 promise 对象
    std::thread th(threadFunction, std::move(promiseObj));
    
    // 等待并获取共享状态的值
    std::cout << "Value: " << futureObj.get() << std::endl;
    
    // 等待线程结束
    th.join();
    
    return 0;
}

在这个示例中:

  1. 主线程创建了一个 std::promise<int> 对象。
  2. 通过 promiseObj.get_future() 获取一个 std::future<int> 对象。
  3. 创建并启动一个新线程,将 std::promise<int> 对象(通过 std::move 移动)传递给新线程。
  4. 新线程执行一些工作(模拟为睡眠2秒),然后通过 promiseObj.set_value(10) 设置共享状态的值。
  5. 主线程通过 futureObj.get() 获取共享状态的值,并输出它。
  6. 主线程等待新线程结束。

这种机制使得线程间的结果传递变得简单和直观,并且 std::futurestd::promise 提供了异常传递的能力,增强了代码的健壮性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号