0

0

c++中的std::promise和std::future怎么用_c++异步通信机制详细解析

冰火之心

冰火之心

发布时间:2025-10-29 12:41:02

|

562人浏览过

|

来源于php中文网

原创

std::promise和std::future是C++11引入的异步通信机制,用于线程间传递单次结果或异常;std::promise设置值或异常,std::future获取结果,二者通过共享状态关联,支持阻塞等待、超时检查与异常传递,适用于手动控制结果设置的复杂异步场景。

c++中的std::promise和std::future怎么用_c++异步通信机制详细解析

在C++11中引入的 std::promisestd::future标准库提供的异步通信机制,用于在线程之间传递单次结果值或异常。它们构成了C++并发编程中一种简洁而强大的数据传递方式。

基本概念:什么是 std::promise 和 std::future?

std::promise 是一个可写入一次的对象,用于设置某个值或异常;std::future 是与之关联的只读对象,用于获取这个值。两者通过共享状态连接,通常用于一个线程生产结果、另一个线程消费结果的场景。

关键点:

  • 每个 std::promise 都绑定一个唯一的 std::future
  • 结果只能设置一次,多次调用 set_value() 会抛出异常
  • 获取结果时可通过 get() 阻塞等待,直到值可用

基本使用方法

下面是一个简单的例子,展示主线程等待子线程计算完成并取得结果:

立即学习C++免费学习笔记(深入)”;

#include 
#include 
#include 

void compute(std::promise&& prom) { int result = 42 * 2; // 模拟耗时计算 prom.set_value(result); // 设置结果 }

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

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

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

t.join();
return 0;

}

说明:

  • promise 以右值形式传给线程函数(避免拷贝)
  • 调用 get_future() 获取对应的 future
  • 在另一端调用 set_value() 提供结果
  • 主线程调用 get() 等待并取出结果

处理异常情况

除了正常值,std::promise 还能传递异常。使用 set_exception() 可以捕获当前异常并转发给 future。

Subtxt
Subtxt

生成有意义的文本并编写完整的故事。

下载
void may_fail(std::promise&& prom) {
    try {
        throw std::runtime_error("计算失败");
    } catch (...) {
        prom.set_exception(std::current_exception());
    }
}

接收端调用 get() 时会重新抛出该异常:

std::future fut = ...;
try {
    double val = fut.get();
} catch (const std::exception& e) {
    std::cout << "捕获异常: " << e.what() << "\n";
}

支持非 void 类型和延迟获取

std::promise 支持任意可移动类型,包括自定义结构体:

struct Result {
    int code;
    std::string msg;
};

std::promise p; std::future f = p.get_future();

// 在其他线程 p.set_value({200, "OK"});

// 主线程 Result r = f.get(); // 阻塞等待

还可配合 wait_for()wait_until() 实现超时检查:

auto status = f.wait_for(std::chrono::seconds(2));
if (status == std::future_status::ready) {
    std::cout << "结果已就绪\n";
} else {
    std::cout << "仍在处理中\n";
}

与其他异步机制的对比

相比 std::asyncpromise/future 更灵活:

  • std::async 自动启动任务,适合简单异步调用
  • promise/future 允许手动控制何时设置结果,适用于事件驱动、回调转同步等复杂场景
  • 可以将 promise 作为参数传递给回调函数,在事件发生时填充结果

基本上就这些。std::promise 和 std::future 提供了一种清晰的“一写一读”线程通信模型,特别适合需要跨线程传递单个结果的场合。掌握它们有助于构建更可控的异步逻辑。注意资源管理和异常安全,避免 promise 未被设置导致 future 无限等待。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

184

2025.07.04

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

171

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

89

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

462

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

462

2023.08.10

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

295

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

390

2023.10.12

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.2万人学习

C 教程
C 教程

共75课时 | 3.6万人学习

C++教程
C++教程

共115课时 | 9.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号