新闻中心

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

2025-11-17
浏览次数:
返回列表
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视频和图片创作助手

小云雀 1949 查看详情 小云雀

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 site  # seo面试答案  # seo新手入门自学推广  # 并在  # 还能  # 就能  # 工具  # 有什么区别  # 多线程  # 抛出  # 是一个  # 如何实现  # 如何使用  # 同步机制  # 区别  # stream  # ios  # c++  # ai 


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


相关推荐: J*aScript中安全有效地处理localStorage字符串数据  解决移动端滚动问题的overflow属性应用指南  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  从J*aScript对象中精确提取指定属性的教程  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  顺丰国际快递查询 国际件官方查询入口  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  必由学官网入口 必由学教师登录入口  outlook中文官网入口地址 outlook官方中文版直达首页链接  蛙漫安全无毒 官方认证的绿色入口  解决Django多数据库/多Schema环境下外键迁移问题  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  12306选座怎么选到临时改签座_12306改签选座策略与步骤  J*aScript:在map操作中高效处理空数组  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  TikTok网页版直接登录 TikTok网页端官方平台入口  J*aScript中赋值与自增运算符的复杂交互与执行机制  微信语音通话掉线如何解决 微信语音通话稳定优化方法  基于动态规划的房屋花卉种植最小成本算法详解  CSS图片焦点样式实现教程:理解与应用tabindex属性  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  2026春节假期票务安排_2026春节放假购票指南  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  PHP中高效并行检查多链接状态的教程  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  Go语言中JSON数据解码与字段访问指南  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  如何提高微信支付的安全性_微信支付安全防护与设置建议  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  怎么在mac上运行html代码_mac运行html代码方法【指南】  poki免费入口快捷访问 poki人气小游戏直接玩站点  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧 

搜索