新闻中心
C++如何使用std::future和std::promise_C++异步编程与future/promise应用
std::future和std::promise用于线程间异步传递结果,promise通过set_value设置值,future通过get获取结果,二者共享状态通信,避免锁的使用。

在C++中,std::future 和 std::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
使用AI生成一流的文案广告,电子邮件,网站,列表,博客,故事和更多…
95
查看详情
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地址的实践指南


2025-11-10
浏览次数:次
返回列表
) {
try {
throw std::runtime_error("出错了!");
} catch (...) {
p.set_exception(std::current_exception());
}
}