0

0

c++中future和promise怎么配合使用_c++多线程异步通信实现

穿越時空

穿越時空

发布时间:2025-10-12 12:43:01

|

1017人浏览过

|

来源于php中文网

原创

std::future和std::promise用于C++多线程间异步通信,实现生产者-消费者模式;std::promise设值或异常,std::future获取结果,二者通过get_future关联,支持异常传递与移动语义,需注意仅能设置一次且避免未设值销毁。

c++中future和promise怎么配合使用_c++多线程异步通信实现

在C++多线程编程中,std::futurestd::promise 是一对用于实现异步通信的重要工具。它们配合使用可以在线程之间传递结果或异常,实现一种“生产者-消费者”模式的数据传递机制。

基本概念:future 与 promise 的作用

std::promise 是一个可写入一次的容器,用于保存某个值或异常;而 std::future 是与之关联的只读对象,用于在未来某个时间点获取这个值。每个 promise 都可以通过 get_future() 获取对应的 future。

典型场景是一个线程计算结果并将其设置到 promise 中,另一个线程通过对应的 future 等待并获取该结果。

基本用法示例

下面是一个简单的例子,展示两个线程如何通过 promise 和 future 进行通信:

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

#include 
#include 
#include 

void producer(std::promise&& prms) {
    try {
        // 模拟耗时操作
        std::this_thread::sleep_for(std::chrono::seconds(2));
        int result = 42;
        prms.set_value(result); // 设置结果
    } catch (...) {
        prms.set_exception(std::current_exception());
    }
}

void consumer(std::future&& fut) {
    std::cout << "等待结果...\n";
    int value = fut.get(); // 阻塞直到结果可用
    std::cout << "收到结果:" << value << "\n";
}

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

    std::thread t1(producer, std::move(prms));
    std::thread t2(consumer, std::move(fut));

    t1.join();
    t2.join();

    return 0;
}

在这个例子中:

一键职达
一键职达

AI全自动批量代投简历软件,自动浏览招聘网站从海量职位中用AI匹配职位并完成投递的全自动操作,真正实现'一键职达'的便捷体验。

下载
  • 主线程创建了一个 promise 和其对应的 future
  • producer 线程负责生成数据,并通过 set_value() 将结果写入 promise。
  • consumer 线程调用 get() 在 future 上阻塞等待,直到值可用。

异常传递支持

promise 不仅能传递正常值,还能传递异常。如果计算过程中发生错误,可以使用 set_exception() 方法将异常保存进去,future 在 get() 时会重新抛出该异常。

例如:

void faulty_producer(std::promise&& prms) {
    try {
        throw std::runtime_error("计算失败");
    } catch (...) {
        prms.set_exception(std::current_exception());
    }
}

当 consumer 调用 fut.get() 时,会抛出 runtime_error,需用 try-catch 处理。

实用技巧与注意事项

使用 promise 和 future 时需要注意以下几点:

  • 每个 promise 只能调用一次 set_value、set_exception 或 set_exception_at_thread_exit(否则会抛出 std::future_error)。
  • 若 promise 被销毁前未设置值,且没有被“放弃”(如调用 std::promise::set_value()),则其 future 会在 get() 时抛出 std::future_error。
  • 移动语义是必须的:promise 和 future 都不可复制,只能移动。
  • 可用于线程间解耦:发送方只需关心设置结果,接收方只关注获取结果,无需显式锁。

基本上就这些。合理使用 promise 和 future,可以让多线程任务的结果传递更清晰安全。虽然功能强大,但也注意避免死锁——比如不要在等待 future 的同时持有锁,导致生产者无法完成写入。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

502

2023.08.10

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

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

166

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

13

2026.01.21

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

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

166

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

13

2026.01.21

promise的用法
promise的用法

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

306

2023.10.12

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

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

精品课程

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

共58课时 | 4.2万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4.1万人学习

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

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