新闻中心

C++如何使用std::future和std::promise_C++异步编程与future/promise应用

2025-11-10
浏览次数:
返回列表
std::future和std::promise用于线程间异步传递结果,promise通过set_value设置值,future通过get获取结果,二者共享状态通信,避免锁的使用。

c++如何使用std::future和std::promise_c++异步编程与future/promise应用

在C++中,std::futurestd::promise 是异步编程的重要工具,它们提供了一种在线程之间传递结果的机制。当你需要一个线程执行任务并返回结果,而另一个线程等待这个结果时,future 和 promise 就非常有用。

基本概念:future 与 promise 的作用

std::promise 是一个“承诺”,它允许你在某个时刻设置一个值或异常。每个 promise 对象都关联一个 std::future,future 可以用来获取这个值,通常是在另一个线程中等待结果。

简单来说:

  • promise 用于“产生”结果(set_value)
  • future 用于“获取”结果(get)

两者通过共享状态进行通信,这种机制避免了直接使用锁来传递数据。

创建和使用 future/promise 的基本流程

以下是一个简单的例子,展示如何在一个线程中设置值,在另一个线程中获取:

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

void set_value(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(set_value, std::move(prom));

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

    t.join();
    return 0;
}

说明:

  • 主线程创建 promise 并获取其 future
  • 新线程接收 promise 的右值引用,并在任务完成后调用 set_value
  • 主线程调用 get() 等待结果,一旦 set_value 被调用,get() 返回

处理异常与多次设置问题

除了正常值,promise 还可以传递异常:

Yaara Yaara

使用AI生成一流的文案广告,电子邮件,网站,列表,博客,故事和更多…

Yaara 95 查看详情 Yaara
void may_throw(std::promise<double>&& p) {
    try {
        throw std::runtime_error("出错了!");
    } catch (...) {
        p.set_exception(std::current_exception());
    }
}

future 在调用 get() 时会重新抛出该异常。注意:每个 promise 只能调用一次 set_value 或 set_exception,否则会抛出 std::future_error。

常见错误:

  • 忘记调用 set_value,导致 future 永远阻塞
  • 重复设置值,引发异常
  • promise 析构前未设置值,future 调用 get() 会抛出异常

与 std::async 的对比

C++ 还提供了 std::async,它自动管理线程和 future,更简洁:

auto fut = std::async([]{ 
    std::this_thread::sleep_for(std::chrono::seconds(1)); 
    return 88; 
});
std::cout << fut.get() << "\n";  // 自动启动线程

但 async 不提供对线程生命周期的精细控制。当你需要手动控制何时、在哪设置结果时,promise 更灵活。

基本上就这些。std::future 和 std::promise 提供了清晰的异步数据传递方式,适合解耦生产者与消费者线程。合理使用,能写出更安全、可读性更强的并发代码。

以上就是C++如何使用std::future和std::promise_C++异步编程与future/promise应用的详细内容,更多请关注其它相关文章!


# ai  # c++  # ios  # stream  # 如何使用  # 工具  # 母婴网站建设海报  # 视频SEO优化工具  # 运营也包括seo么  # 门户网站推广营销例子  # 京东618新浪推广营销  # 律师营销推广开拓方案  # 营销推广决策的内容包括  # 网站建设厂  # seo公众号怎么设置  # 黄石谷歌seo开户  # 并在  # 你在  # 还可以  # 是在  # 内存管理  # 更快  # 当你  # 抛出  # 是一个 


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


相关推荐: vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  qq游戏网页版直接玩_qq游戏免下载快速入口  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  铁路12306的积分有效期是多久_铁路12306积分有效期说明  c++中为什么推荐使用using替代typedef_c++现代化类型别名  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  生成rdflib自定义SPARQL函数:参数匹配与实践指南  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  铃兰之剑为这和平的世界希里技能组及加点推荐  限制HTML日期输入框的日期选择范围  Golang如何使用const iota_Go iota常量计数器讲解  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  海量存储:机器视觉智能化的核心基石  Lar*el Excel导入时生成自定义递增ID的策略与实践  2026春节假期票务安排_2026春节放假购票指南  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  AO3最新入口2025公告_AO3中文官网合集  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  Centos/Linux 系统下安装 composer 的完整步骤  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  提升Kafka消费者健壮性:会话超时处理与消息处理语义  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  J*aScript Promise链中如何正确终止后续.then执行并处理错误  Composer如何解决json扩展缺失的错误  绝地鸭卫平a核爆刀流玩法攻略  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  Python Socket多播通信中指定源IP地址的实践指南 

搜索