C++中future和promise怎么用_C++多线程间值传递异步操作【并发】-C++

future 和 promise 是用于线程间安全传递单个计算结果的异步通信工具,非线程启动机制;promise 单次写入、future 单次读取,通过共享状态关联,不可拷贝但可移动。

future 和 promise 是一对配合使用的异步通信工具

它们不是用来“启动线程”的,而是在线程之间安全传递单个计算结果的桥梁。一个线程用 promise 设置值,另一个线程用 future 等待并获取该值。核心约束是:每个 promise 只能调用一次 set_value()(或 set_exception()),否则抛出 std::future_error(错误码为 std::future_errc::promise_already_satisfied)。

  • std::promise 持有写权限,负责“发信号”;std::future 持有读权限,负责“收信号”
  • 两者通过共享状态(shared state)关联,通常由 promise.get_future() 获取对应 future
  • 不能拷贝 future 或 promise,但可以移动(std::move)
  • 如果 future 被析构而没人调用 get(),且 promise 未被满足,程序不会崩溃,但该结果永久丢失

如何避免 future.wait() 阻塞主线程

直接调用 future.wait() 会阻塞当前线程直到结果就绪,这在 GUI 或响应式系统中不可接受。更实用的方式是轮询或超时等待:

  • 用 future.wait_for(std::chrono::milliseconds(10)) == std::future_status::ready 做非阻塞检测
  • 用 future.wait_until(std::chrono::steady_clock::now() + std::chrono::seconds(2)) 设定绝对截止时间
  • 真正异步响应应结合 std::async 或手动线程 + 回调,future 本身不提供回调机制
  • 注意:wait_for 和 wait_until 返回 std::future_status::timeout 时不抛异常,但后续调用 get() 仍会阻塞到就绪

promise.set_value() 必须在 shared state 销毁前调用

如果 promise 对象先于关联的 future 被销毁,且尚未调用 set_value() 或 set_exception(),则其 shared state 进入“broken”状态。此时 future.get() 会立即抛出 std::future_error(错误码为 std::future_errc::broken_promise)。

  • 常见陷阱:把 promise 声明在局部作用域,又在线程中异步调用 set_value(),但主线程已退出作用域导致 promise 析构
  • 解决方法:将 promise 包装进 std::shared_ptr,确保生命周期覆盖异步写入过程
  • 或者改用 std::packaged_task,它自动管理 promise 生命周期,并可绑定到任意可调用对象

与 std::async 的关系:别混用,也别替代

std::async 内部封装了 promise/future,但它还负责线程调度和延迟策略(std::launch::async 或 std::launch::deferred)。你不能用 async 替代手动管理的 promise——比如无法从 async 返回的 future 反向拿到 promise 来设值。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++中future和promise怎么用_C++多线程间值传递异步操作【并发】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008093+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008094+
  • 本周更新: 0+
  • 最后更新: 2026-03-16