新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++ future、promise 与 async:接收后台结果,也接住后台异常

发布时间:2026/9/28 21:08:39来源:尧图网络
C++ future、promise 与 async:接收后台结果,也接住后台异常
C future、promise 与 async接收后台结果也接住后台异常启动线程只是并发任务的一半另一半是把结果或失败传回来。future 负责接收共享状态中的结果promise 负责显式提供结果async 则把任务启动与结果通道组合起来。最低标准C14示例使用初始化捕获。示例显式使用 launch::async不依赖默认启动策略。1. 两种交付结果的方式#includeexception#includefuture#includeiostream#includestdexcept#includethread#includeutilityintsquare(intx){if(x0)throwstd::runtime_error(negative input);returnx*x;// 本例仅传入 -1通用函数需额外处理乘法溢出}intmain(){autotaskstd::async(std::launch::async,square,-1);try{std::couttask.get()\n;}catch(conststd::exceptione){std::coute.what()\n;}std::promiseintproducer;autoresultproducer.get_future();std::threadworker([pstd::move(producer)]()mutable{try{p.set_value(42);}catch(...){p.set_exception(std::current_exception());}});worker.join();std::coutresult.get()\n;}future、promise 和 async 工具本身自 C11 提供本例使用 C14 的初始化捕获来转移 promise。输出为 negative input 和 42。async 任务的异常保存在共享状态里在 get 时重新抛出promise 也可以通过 set_exception 把工作线程的异常传回接收端。2. get 与 wait 不是一回事wait 等到共享状态就绪但不取出结果也不负责把任务异常重新抛出。get 等待并取得结果或者抛出保存的异常。普通 future 的 get 会消耗关联状态之后不能再重复 get。需要多个接收者重复观察同一结果时可以研究 shared_future但它不自动让结果指向的可变对象线程安全。3. 默认 async 不保证马上开线程不指定策略时实现可以选择异步执行或延迟执行。使用 launch::async 可以明确要求异步方式但资源不足仍可能让任务启动失败需要按实际场景处理异常。来自 async 的 future 在特定条件下销毁时可能等待任务结束。因此把返回的 future 当成临时对象直接丢弃可能让本以为并行的多次调用变成串行等待。应保存 future并在合适的位置统一接收结果。4. promise 是一次性交付通道同一个共享状态不能随意重复 set_value 或 set_exception。若提供者在交付前销毁接收端可能得到 broken_promise 错误。通道不是队列不适合反复传递多条消息。示例先 join 再 get确保本地线程正常结束后才处理结果。实际代码若把可能抛异常的操作放在 join 之前还需要用 RAII 管理线程防止异常路径留下 joinable 的 thread。异步不等于可以无限创建任务。任务很多时要限制并发量并设计取消、超时和退出流程这些能力不能仅靠一个 future 自动获得。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI批量重写存量代码:GitHub三周128个PR的工程实践拆解 2026/9/28 21:53:55

AI批量重写存量代码:GitHub三周128个PR的工程实践拆解

1. 一个反直觉的工程选择:让 AI 修改自己的源码先说一个可能和多数人直觉相悖的事实:GitHub 这个承载了全球数亿个代码仓库的平台,其自身的代码库也面临着所有老系统都会遇到的麻烦——技术债堆叠、依赖版本过于陈旧、核心服务之间的耦合越来…

阅读更多 →
辉芒微FT62F28X烧录与调试避坑指南 2026/9/28 21:53:49

辉芒微FT62F28X烧录与调试避坑指南

1. 项目概述:为什么辉芒微FT62F28X的烧录与调试值得专门拆解FMD IDE、辉芒微、FT62F28X、烧录、调试——这五个词组合在一起,不是泛泛而谈的“单片机开发入门”,而是指向一个非常具体、非常真实、也相当容易踩坑的工程现场:一款国…

阅读更多 →
AI自主提交128个PR重构83万行代码的工程方法论 2026/9/28 21:53:49

AI自主提交128个PR重构83万行代码的工程方法论

前几天看到 GitHub 那波"AI 自己给自己提交了128个PR、改了83万行代码"的消息时,我第一反应是:又来了个噱头。但把三周时间线、PR列表和自动化验证的细节翻了一遍之后,我发现真正值得聊的其实不是"AI 重写自己"这个标题&…

阅读更多 →
Superpowers实战:给Codex与Claude Code装上结构化技能库 2026/9/28 21:53:49

Superpowers实战:给Codex与Claude Code装上结构化技能库

最近一段时间我几乎逢人就推荐一个东西:给手头的 Codex(或者 Claude Code,看你习惯用哪个)装上 superpowers。你第一次听到这个名字可能会觉得夸张,但它解决的事情非常具体——默认状态下,AI 编码代理更像一…

阅读更多 →
STM32串口调试5分钟闭环:USB转TTL驱动与硬件连接全指南 2026/9/28 21:52:54

STM32串口调试5分钟闭环:USB转TTL驱动与硬件连接全指南

1. 为什么“5分钟搞定”不是口号,而是可复现的操作节奏STM32串口通信,是每个嵌入式新手跨出开发板点亮LED后的第一道真实门槛。它不像GPIO那样只写寄存器就能看到结果,而是一条需要两端协同、软硬咬合、信号精准对齐的“数据通道”。你手里的…

阅读更多 →
校园POS消费数据清洗与行为建模实战指南 2026/9/28 21:52:54

校园POS消费数据清洗与行为建模实战指南

简介:本资源是一份面向本科生与Python初学者的校园消费行为分析实战项目,适用于毕业设计、期末大作业及课程设计场景,聚焦学生群体消费偏好、时段规律与食堂就餐结构等现实问题,助力掌握从数据清洗到建模可视化的完整分析链路。压…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉