0

0

C++如何使用future和promise_C++11中实现异步操作与线程间通信

下次还敢

下次还敢

发布时间:2025-11-24 08:14:02

|

648人浏览过

|

来源于php中文网

原创

std::future和std::promise通过共享状态实现线程间通信,允许异步任务返回结果或异常。使用std::async可快速创建异步任务并获取future;手动创建时,promise调用set_value或set_exception设置结果,future通过get获取值或抛出异常,支持移动语义跨线程传递所有权,结合wait_for、wait_until和valid可实现灵活的状态检查与同步控制。

c++如何使用future和promise_c++11中实现异步操作与线程间通信

在C++11中,std::futurestd::promise 是实现异步操作和线程间通信的重要工具。它们提供了一种机制,使得一个线程可以将结果传递给另一个线程,而无需共享变量或使用互斥锁进行复杂同步。

基本概念:future 与 promise 的作用

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

典型使用场景包括:

  • 从后台线程返回计算结果
  • 通知某事件已完成
  • 实现简单的线程协作

创建异步任务并获取结果

使用 std::async 可以快速启动异步任务,并自动返回一个 std::future

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

#include 
#include 

int compute() {
    return 42;
}

int main() {
    std::future fut = std::async(compute);
    int result = fut.get(); // 阻塞直到结果可用
    std::cout << "Result: " << result << "\n";
    return 0;
}

这里 fut.get() 会等待任务完成并取出结果。如果任务抛出异常,调用 get 会重新抛出该异常。

手动使用 promise 实现线程通信

当需要更精细控制时,可以手动绑定 promisefuture

ARTi.PiCS
ARTi.PiCS

ARTi.PiCS是一款由AI驱动的虚拟头像生产器,可以生成200多个不同风格的酷炫虚拟头像

下载
#include 
#include 
#include 

void set_value(std::promise&& prom) {
    prom.set_value(100); // 设置结果
}

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

    std::thread t(set_value, std::move(prom));
    
    int value = fut.get();
    std::cout << "Received: " << value << "\n";

    t.join();
    return 0;
}

注意:每个 promise 只能调用一次 set_value,否则会抛出异常。移动语义用于在线程间转移所有权。

处理异常与状态检查

除了正常值,promise 还可以传递异常:

void may_throw(std::promise&& p) {
    try {
        throw std::runtime_error("Something went wrong");
    } catch (...) {
        p.set_exception(std::current_exception());
    }
}

接收方调用 future 的 get 方法时,异常会被重新抛出。

还可以非阻塞地检查 future 状态:

  • fut.wait_for(timeout):等待一段时间
  • fut.wait_until(time_point):等待到指定时间点
  • fut.valid():判断是否有关联的共享状态

基本上就这些。合理使用 future 和 promise 能简化多线程编程中的数据传递逻辑,避免显式锁的使用,提升代码可读性和安全性。

相关专题

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

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

479

2023.08.10

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

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

78

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

46

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

121

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

11

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

15

2026.01.09

热门下载

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

精品课程

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

共58课时 | 3.5万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.4万人学习

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

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