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


相关推荐: 如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局  Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】  PPT智能排版生成入口 免费PPT内容自动生成平台  苹果官网国补入口在哪  《360浏览器》设置摄像头权限方法  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30  哔哩哔哩黑名单怎么查看  如何高效地基于键列值映射DataFrame中的多个列  VS Code快捷键when上下文子句的妙用  哔哩哔哩在线观看入口 B站官网免费进入  毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明  江苏大剧院会员卡购买步骤  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  QQ邮箱注册地址 免费获取QQ邮箱账号  vivo手机视频通话美颜怎么设置_vivo视频通话美颜开启方法  手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧  《七读免费小说》开通会员方法  《搜书吧》阅读书籍方法  PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角  中大网校app做题记录清除方法  包子漫画在线观看入口 包子漫画网正版全集链接  如何定制PrimeNG Sidebar的背景颜色  奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧  POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  126手机126邮箱登录_126邮箱手机登录入口官网  J*aScript类型数组_TypedArray使用  mysql中如何配置字符集和排序规则_mysql字符集排序配置  苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤  《虎扑》取消评分记录方法  《磁力猫》最好用的磁官网  iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法  如何通过settings.json个性化您的VS Code体验  抖音号升级企业号怎么改名字?升级企业号有哪些好处?  J*aScript事件处理:优化键盘输入与表单提交的实践指南  Python对象引用与属性赋值:理解链表中的行为  店铺如何做视频号推广?做视频号推广有用吗?  个人所得税办理入口 个人所得税综合所得年度汇算入口  路由器DNS怎么设置最快 优化DNS提升上网速度教程  4399造梦西游3无敌版_4399游戏入口  解决PHP MySQL数据库更新无响应:SQL查询语法错误解析  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】  Composer reinstall命令重装损坏的包  VS Code如何设置默认配置  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  《偃武》甘宁技能详解  DeepSeek超全面指南:入门必看 

 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.