信息发布→ 登录 注册 退出

c++中std::promise和std::future怎么用_c++异步编程模型详解【多线程】

发布时间:2025-12-09

点击量:
std::promise和std::future是C++11提供的单次异步通信机制,promise负责设置值或异常,future用于等待并获取该结果;shared_future支持多处并发等待同一结果。

std::promise 和 std::future 是 C++11 引入的异步通信机制,用于在线程间安全地传递单次结果。它们不负责执行任务,只负责“承诺一个值”和“获取那个值”,常与 std::thread、std::async 或线程池配合使用。

std::promise:发出一个“我将来会给你一个值”的承诺

一个 std::promise 对象代表一个可写的“结果容器”。它只能设置一次值(或异常),之后再调用 set_value / set_exception 会抛出 std::future_error。

  • 用 promise.set_value(val) 提交结果(类型必须匹配 future 的 value_type)
  • 用 promise.set_exception(std::make_exception_ptr(e)) 传递异常
  • 通过 promise.get_future() 获取对应的 std::future —— 每个 promise 只能绑定一个 future

std::future:等待并获取 promise 承诺的结果

std::future 是只读句柄,代表一个“尚未就绪但将来会出现的值”。它支持阻塞等待、限时等待、轮询检查,也可移动(不可拷贝)。

  • .get():阻塞直到结果就绪,返回值(或 rethrow 异常),调用后 future 失效
  • .wait():仅阻塞等待,不取值
  • .wait_for(duration) / .wait_until(time_point):带超时的等待,返回 future_status 枚举(ready、timeout、deferred)
  • .valid():判断 future 是否关联有效共享状态(比如是否已 move 出或未被 get 过)

典型协作模式:生产者-消费者线程间传值

常见场景是主线程创建 promise/future 对,把 promise 移交给工作线程,自己保留 future 等待结果。

std::promise p;
std::future f = p.get_future();

std::thread t([&p]() {
    std::this_thread::sleep_for(1s);
    p.set_value(42); // 工作线程完成计算后交付结果
});
t.detach(); // 或 join()

// 主线程等待结果
int result = f.get(); // 阻塞直到 set_value 被调用

std::shared_future:支持多处等待同一结果

std::future 不可拷贝,如果多个地方需要等待同一个结果,需用 std::shared_future。它由 future.share() 创建,允许多个实例同时 wait / get(但 get 仍只能调用一次 per instance,且所有实例共享底层状态)。

  • 适用于广播式通知:例如多个监控线程等待某个初始化完成
  • shared_future 支持拷贝,底层引用计数管理共享状态生命周期
  • 注意:即使 shared_future 被拷贝多次,set_value 仍只能调用一次

基本上就这些。promise/future 不复杂但容易忽略细节——比如忘记 detach/join 线程、重复调用 get、误用拷贝 future,都会导致未定义行为或死锁。用好它们的关键是明确“谁生产、谁消费、何时交付、如何容错”。

标签:# 异步  # 抛出  # 绑定  # 也可  # 适用于  # 句柄  # 给你  # 将来  # 多处  # 死锁  # 多个  # ai  # promise  # 对象  # 并发  # Thread  # 主线程  # 多线程  # 线程  # red  # c++  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!