std::future和std::promise是C++11提供的单次值线程间传递机制:promise通过set_value/set_exception写入结果,future通过get/wait_for读取,共享状态自动同步,仅可移动不可拷贝。
std::future 和 std::promise 是 C++11 引入的用于在线程间传递单次值的配套机制:promise 负责“设置”结果,future 负责“获取”结果。它们不共享内存,而是通过一个共享状态(shared state)解耦生产者与消费者,适合一对一线程通信或异步任务结果传递。
promise 对象持有可写入的共享状态,调用 set_value() 后,绑定的 future 就能通过 get() 安全读取(若未就绪则阻塞)。注意:每个 promise/future 对只能使用一次,且不能拷贝(仅可移动)。
// 示例:主线程等待子线程计算完成
#include#include #include int main() { std::promise prom; std::future fut = prom.get_future(); // 获取关联的 future std::thread t([&prom]() { // 模拟耗时计算 std::this_thread::sleep_for(std::chrono::seconds(1)); prom.set_value(42); // 设置结果(只能调用一次) }); std::cout << "等待结果...\n"; int result = fut.get(); // 阻塞直到 set_value 被调用 std::cout << "得到结果:" << result << "\n"; t.join(); return 0; }
如果异步操作可能失败,promise 支持通过 set_exception 传递异常对象,future 的 get() 会重新抛出该异常,避免错误被静默吞掉。
// 在子线程中捕获异常并转发
std::thread t([&prom]() {
try {
throw std::runtime_error("计算失败");
} catch (...) {
prom.set_exception(std::current_exception()); // 转发当前异常
}
});
try {
int x = fut.get(); // 这里会抛出 runtime_error
} catch (const std::exception& e) {
std::cout << "捕获异常:" << e.what() << "\n";
}
future 提供超时等待能力,避免无限阻塞。wait_for 返回 std::future_status 枚举值,可用于轮询或带超时的同步逻辑。
// 等待最多 500ms
if (fut.wait_for(std::chrono::milliseconds(500)) == std::future_status::ready) {
std::cout << "成功获取:" << fut.get() << "\n";
} else {
std::cout << "超时,任务未完成\n";
}
std::async 会自动创建 promise/future 对,并启动异步任务。它返回的 future 也支持 get()、wait_for 等操作,但底层调度由实现决定(可能延迟执行)。若需精确控制线程生命周期或手动触发,仍应显式使用 promise/future。
// 等效但更简短(内部仍用 promise/future 实现)
auto fut2 = std::async(std::launch::async, []() -> int {
std::this_thread::sleep_for(std::chrono::seconds(1));
return 123;
});
std::cout << "async 结果:" << fut2.get() << "\n";
基本上就这些。核心是理解 promise 是“写端”,future 是“读端”,共享状态自动管理线程安全——你不用加锁,get() 和 set_value() 内部已同步。注意别重复 set、别跨线程拷贝 promise/future、及时 join 或 detach 线程即可。
# ai
# c++
# ios
# stream
# 异步任务
# red
# 线程
# 线程生命周期
# 主线程
# 对象
# promise
# 异步
# 抛出
# 就能
# 最多
# 适用于
# 你不用
# 绑定
# 未完成
# 加锁
# 但更
# 仍应
相关文章:
如何通过虚拟主机空间快速建站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
制作网站的公司有哪些,做一个公司网站要多少钱?
如何在云服务器上快速搭建个人网站?
制作表格网站有哪些,线上表格怎么弄?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
网站制作说明怎么写,简述网页设计的流程并说明原因?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
如何在腾讯云免费申请建站?
如何解决ASP生成WAP建站中文乱码问题?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
制作网站怎么制作,*游戏网站怎么搭建?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何快速生成ASP一键建站模板并优化安全性?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何将凡科建站内容保存为本地文件?
如何选择可靠的免备案建站服务器?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
制作宣传网站的软件,小红书可以宣传网站吗?
想学网站制作怎么学,建立一个网站要花费多少?
如何选择PHP开源工具快速搭建网站?
如何选择高效便捷的WAP商城建站系统?
制作旅游网站html,怎样注册旅游网站?
如何在阿里云高效完成企业建站全流程?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
如何用腾讯建站主机快速创建免费网站?
建站之星如何实现网站加密操作?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
微信推文制作网站有哪些,怎么做微信推文,急?
C++中引用和指针有什么区别?(代码说明)
广州营销型建站服务商推荐:技术优势与SEO优化解析
建站之星ASP如何实现CMS高效搭建与安全管理?
Bpmn 2.0的XML文件怎么画流程图
广东企业建站网站优化与SEO营销核心策略指南
如何通过虚拟机搭建网站?详细步骤解析
手机网站制作与建设方案,手机网站如何建设?
建站之星后台密码遗忘或太弱?如何重置与强化?
html制作网站的步骤有哪些,iapp如何添加网页?
如何登录建站主机?访问步骤全解析
如何高效配置香港服务器实现快速建站?
C#如何序列化对象为XML XmlSerializer用法
常州自助建站工具推荐:低成本搭建与模板选择技巧
如何在腾讯云服务器快速搭建个人网站?
建站与域名管理如何高效结合?
定制建站方案优化指南:企业官网开发与建站费用解析
制作门户网站的参考文献在哪,小说网站怎么建立?
建站之星各版本价格是多少?
如何在橙子建站中快速调整背景颜色?
*请认真填写需求信息,我们会在24小时内与您取得联系。