新闻中心
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 是用于在线程之间传递结果的重要工具。它们提供了一种异步通信机制:一个线程可以将结果“承诺”给另一个线程,后者通过“未来”对象获取该值,即使这个值尚未准备好。
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邮箱日历功能怎么用_创建日程与会议邀请的技巧


2025-11-17
浏览次数:次
返回列表