新闻中心

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

2025-12-09
浏览次数:
返回列表
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 等待结果。

Songtell Songtell

Songtell是第一个人工智能生成的歌曲含义库

Songtell 164 查看详情 Songtell

立即学习“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++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  Discord Slash 命令响应超时问题的异步解决方案  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  Python实时数据流中的动态最值查找策略  J*a应用程序首次运行自动创建文件与目录的最佳实践  Win10双系统截图高效法 截屏快捷键速记【技巧】  iCloud登录入口网页版 苹果iCloud官网登录  AO3镜像入口大全 AO3网页版内容访问全集  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  谷歌google账号注册详细步骤 谷歌账号注册官方教程  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  谷歌推RCS信息存档功能:公司可监控员工私密信息!  qq游戏大厅官方下载_qq游戏免费下载安装入口  浏览器打开即用 美图秀秀网页版入口  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  必由学官方网站入口 必由学学生教师共用登录通道  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  微信群消息显示延迟如何解决 微信群消息刷新优化方法  mc.js官网登录入口 mc.js官方登录入口最新版  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  黑猫投诉统一入口官网 消费者权益保护投诉平台  Python实现多节点属性重叠度分析教程  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  steam官方入口大全 steam账号注册及操作指南  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  Flexbox布局实践:实现粘性导航栏与底部固定页脚  拼多多赚钱渠道_拼多多收益来源  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  CSS布局中意外空白:解决padding-top导致的顶部间距问题  在Typer应用中优雅地处理和重组任意命令行参数  steam官方网页快速访问 steam账号注册全流程  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  快手官方唯一登录入口 谨防山寨钓鱼网站  Pyrogram与g4f集成:异步编程实践与常见错误解决  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  优化大型XML文件解析:基于Python流式处理的内存高效方案  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  探索高级语言到原生C/C++的转译:挑战与内存管理策略 

搜索