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


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

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

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 等待结果。

达芬奇 达芬奇

达芬奇——你的AI创作大师

达芬奇 166 查看详情 达芬奇

立即学习“C++免费学习笔记(深入)”;

std::promise<int> p;
std::future<int> 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,都会导致未定义行为或死锁。用好它们的关键是明确“谁生产、谁消费、何时交付、如何容错”。

以上就是c++++中std::promise和std::future怎么用_c++异步编程模型详解【多线程】的详细内容,更多请关注其它相关文章!


# 边缘  # 镇江网站优化方案分析  # 吉林专业seo外包  # 兴化律师网站推广  # 天津省营销推广  # 荆州抖音seo价格  # 企业网站推广合作方式  # 罗湖区全网营销推广中心  # 企业网站seo营销方法  # 一个网站推广怎么做好  # 福建省seo工资  # 将来  # ai  # 游戏开发  # 如何实现  # 多处  # 尼克  # 死锁  # 多个  # 多线程  # 达芬奇  # red  # c++ 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  iPhone12是否要更新ios16  QQ网页版入口导航 QQ网页版在线访问通道  《虎扑》关闭社区内容推荐方法  电脑视频号|直播|如何分享屏幕  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  Retrofit根路径POST请求:@POST("/") 的应用与解析  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  Highcharts雷达图径向轴数值标签实现教程  掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析  《磁力猫》最好用的磁官网  抖音小程序怎么开通?小程序开通条件是什么?  原子笔记app误删找回教程  解决VS Code中Python版本冲突与输出异常的指南  Pandas中基于动态偏移量实现DataFrame列值位移的策略  Go App Engine 项目结构与包管理深度指南  小红书网页版首页入口 小红书网页版电脑端官方登录链接  RxJS中如何高效地在一个函数内处理和合并多个数据集合  mysql怎么查询数据_mysql基础查询语句使用教程  WooCommerce 新客户订单自动添加管理员备注教程  在React中正确处理HTML input type="number"的数值类型  《via浏览器》强制缩放网页设置方法  《大润发优鲜》充值方法介绍  《广发易淘金》国债逆回购操作教程  怎么恢复删除的电脑文件_数据恢复软件使用教程  解决C#跨线程访问XML对象的异常 安全的并发XML处理模式  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  在VS Code中利用AI辅助进行代码迁移  在Spring Boot Thymeleaf中利用布尔属性实现容器的条件显示  《tt语音》超级玩家开通方法  在PySimpleGUI中实现键盘按键绑定按钮事件  《火花chat》搜索好友方法  深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析  《律学法考》查看学习数据方法  我的世界官方网址入口 我的世界游戏主页直达入口  《新三国志曹操传》游历事件袁尚突围攻略  解决SQLAlchemy模型跨文件关联的Linter兼容性指南  mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法  PHP多语言网站的实现:会话管理与翻译函数优化教程  Python中安全地将环境变量转换为整数的类型注解指南  优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理  全球各国上班时间表外贸邮件时间  PHP实现等比数列:构建数组元素基于前一个值递增的方法  响应式设计中动态背景颜色条的实现指南  iPhone 14 Pro如何更改区域设置_iPhone 14 Pro地区语言修改教程  服装短视频如何起号推广?服装短视频起号推广有什么要求?  小红书如何引流到私信?引流到私信有用吗?  铁拳8在线玩 铁拳8在线秒玩入口  宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些? 

 2025-12-09

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.