c++中std::future和std::promise的用法 _c++ future与promise使用指南


std::future和std::promise用于线程间异步传递结果,promise设置值或异常,future获取结果;示例中主线程通过future阻塞等待另一线程通过promise设置的值,支持异常传递且与std::async相比提供更细粒度控制,需注意只能set一次、避免未设置值即销毁及get后future失效等问题。

c++中std::future和std::promise的用法 _c++ future与promise使用指南

在C++多线程编程中,std::futurestd::promise 是用于在线程之间传递结果的重要工具。它们提供了一种异步通信机制:一个线程可以将结果“承诺”给另一个线程,后者通过“未来”对象获取该值,即使这个值尚未准备好。

std::promise 与 std::future 基本概念

std::promise 是一个可写一次的对象,用来设置某个值或异常。每个 promise 对应一个 std::future,future 是读取端,用来获取 promise 所“承诺”的结果。

一旦值被设置(通过 set_value 或 set_exception),future 就能获取它。这种机制非常适合用于线程间数据传递。

基本用法示例

下面是一个使用 std::promise 和 std::future 的简单例子:

#include <iostream>
#include <thread>
#include <future>

void setValue(std::promise<int>&& p) {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    p.set_value(42); // 设置结果
}

int main() {
    std::promise<int> prom;
    std::future<int> fut = prom.get_future(); // 获取对应的 future

    std::thread t(setValue, std::move(prom));

    std::cout << "等待结果...\n";
    int value = fut.get(); // 阻塞直到值可用
    std::cout << "得到结果: " << value << "\n";

    t.join();
    return 0;
}

说明:

  • 主线程创建 promise 并从中获取 future。
  • 新线程接收 promise 的右值引用,并在处理完成后调用 set_value。
  • 主线程调用 fut.get() 阻塞等待结果。

异常传递

promise 不仅可以传递正常值,还能传递异常:

无限画 无限画

千库网旗下AI绘画创作平台

无限画 574 查看详情 无限画

void setError(std::promise<double>&& p) {
    try {
        throw std::runtime_error("出错了!");
    } catch (...) {
        p.set_exception(std::current_exception());
    }
}

当 future 调用 get() 时,会重新抛出该异常,可以使用 try-catch 捕获。

与 std::async 的区别

std::async 更高层,自动启动任务并返回 future;而 promise 提供更细粒度控制:

  • 你可以决定何时、在哪个线程设置值。
  • 适合事件驱动或回调场景,比如网络请求完成时手动 set_value。
  • 配合条件变量或其他同步机制灵活使用。

注意事项

使用时注意以下几点:

  • 每个 promise 只能 set_value、set_exception 或 set_exception_at_thread_exit 一次,多次调用会抛出 std::future_error。
  • 如果 promise 被销毁前没有设置值,future.get() 会抛出 std::future_error。
  • 务必确保 promise 正确移动传递,避免拷贝(promise 不可拷贝)。
  • get() 只能调用一次,之后 future 处于无效状态。

基本上就这些。std::promise 和 std::future 组合为 C++ 异步编程提供了基础支持,理解它们的协作方式有助于构建清晰的跨线程通信逻辑。

以上就是c++++中std::future和std::promise的用法 _c++ future与promise使用指南的详细内容,更多请关注其它相关文章!


# 高性能  # 北京seo公司专家乐云seo品牌  # 许昌seo技术  # 广州抖音seo案例  # 茂名企业宣传片推广营销  # seo转行新媒体  # 德安一站式网站建设低价  # 临沂网站建设行业分析  # 南昌网站建设服务器  # 营销推广酒吧方案  # 自贡网站推广幼儿园电话  # 见性  # 器中  # 基础设施  # 工具  # 数据结构  # 多线程  # 抛出  # 是一个  # 自己的  # 如何使用  # 同步机制  # 区别  # stream  # ios  # c++  # ai 


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


相关推荐: J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法  word页码灰色不能用如何解决  139邮箱登录入口官网 139邮箱登录入口官网网址  苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤  我居然低估了 DeepSeek,这次更新它做到了这些!  《大润发优鲜》充值方法介绍  铁路12306官网登录入口 铁路12306在线购票官方平台  抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?  歌词怎么展示在|直播|间视频号?有什么注意事项?  VS Code的时间线(Timeline)视图:您的代码时光机  《淘票票》添加到苹果钱包教程  b站如何剪辑视频_b站必剪app使用教程  C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用  mysql中外键约束如何使用_mysql FOREIGN KEY操作  《跳跳舞蹈》循环播放方法  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  《偃武》甘宁技能详解  如何取消数字签名  QQ网页版入口导航 QQ网页版在线访问通道  德邦物流在线查询系统 德邦快递货物运输追踪  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  Excel如何制作月度销售统计图_Excel动态图表制作与控件应用  海棠书屋官方在线书籍入口 海棠书屋文学作品浏览官网链接  苹果手机聊天记录删除了如何恢复  一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化  Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件  喜茶GO更换登录账号方法  《健康大兴》注册方法介绍  macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整  抖音火山版如何进行提现  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  4399造梦西游3无敌版_4399游戏入口  Win10怎么设置快速启动 Win10开启快速启动设置方法  Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略  泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口  修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现  百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法  CSS如何控制元素外边距_margin实现布局间隔  Golang如何初始化module项目_Golang module init使用说明  Python实时数据流中高效查找最大最小值  iPhone12是否要更新ios16  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  使用document.execCommand实现Web文本编辑器加粗/取消加粗  QQ邮箱手机版网页版 QQ邮箱登录入口地址  申通快件单号查询平台 申通包裹物流动态跟踪  《sketchbook》选中部分图案移动方法 

 2025-11-17

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

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

点击免费数据支持

提交您的需求,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.