0

0

c++中std::promise和std::future的配合使用_c++线程间通信与异步结果获取机制

尼克

尼克

发布时间:2025-11-18 20:09:07

|

931人浏览过

|

来源于php中文网

原创

std::promise和std::future用于线程间传递异步结果,生产者通过promise设置值,消费者通过future获取结果,实现解耦与同步。

c++中std::promise和std::future的配合使用_c++线程间通信与异步结果获取机制

在C++多线程编程中,std::promisestd::future 提供了一种简洁高效的线程间通信方式,用于传递异步操作的结果。一个线程可以通过 std::promise 设置值或异常,另一个线程则通过关联的 std::future 获取该结果,实现解耦与异步等待。

基本概念与配合机制

std::promise 是一个可写的一次性容器,用于设置某个值或异常;std::future 是其对应的只读代理,用于在未来某个时间点获取这个值。两者通过共享状态关联。

典型使用流程如下:

  • 创建一个 std::promise 对象
  • 调用其 get_future() 方法获得对应的 std::future
  • promise 移动到生产者线程,future 移动到消费者线程
  • 生产者调用 promise.set_value()set_exception()
  • 消费者调用 future.get() 阻塞等待并取得结果

简单示例:异步计算返回结果

以下代码展示主线程启动工作线程执行任务,并通过 promise/future 获取结果:

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

#include 
#include 
#include 

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

int main() {
    std::promise prom;
    std::future fut = prom.get_future();

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

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

    t.join();
    return 0;
}

注意:必须确保 promise 被正确移动,且只能调用一次 set_value,否则会抛出异常。

白果AI论文
白果AI论文

论文AI生成学术工具,真实文献,免费不限次生成论文大纲 10 秒生成逻辑框架,10 分钟产出初稿,智能适配 80+学科。支持嵌入图表公式与合规文献引用

下载

异常传递与错误处理

除了正常值,std::promise 还能传递异常,使消费者端能捕获并处理错误:

void may_fail(std::promise&& prom) {
    try {
        // 模拟可能失败的操作
        throw std::runtime_error("计算失败");
    } catch (...) {
        prom.set_exception(std::current_exception());
    }
}

在调用 future.get() 时,若设置了异常,则该异常会被重新抛出,可在 catch 块中处理。

应用场景与注意事项

这种机制适用于需要等待单次异步结果的场景,如:

  • 后台加载配置并通知主线程
  • 分离计算与结果消费逻辑
  • 实现简单的任务完成通知(通过 set_value_at_thread_exit)

关键注意事项:

  • 每个 promise 只能设置一次结果,重复调用 set_value 会引发异常
  • promise 被销毁前未设置值,future.get() 会抛出 std::future_error
  • 避免死锁:不要在同一个线程中创建并等待同一个 future,除非有其他线程负责设置值
  • 移动语义:promise 不可复制,必须使用移动操作在线程间传递

基本上就这些。合理使用 std::promise 和 std::future,可以写出清晰、安全的异步通信代码,避免手动管理互斥量和条件变量的复杂性。

相关专题

更多
线程和进程的区别
线程和进程的区别

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

480

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

promise的用法
promise的用法

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

298

2023.10.12

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

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

396

2023.10.12

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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