std::promise 详解及底层原理
一、std::promise 核心定位与作用
std::promise 是 C++11 引入的异步结果提供者(异步 provider),定义在 <future> 头文件中,核心作用是在一个线程中存储值(类型为 T)或异常,并将该结果关联到对应的 std::future 对象,让另一个线程可以通过 std::future 安全地获取这个结果(值/异常),是实现线程间同步与结果传递的核心组件。
简单来说:promise 负责「生产结果」,future 负责「消费结果」,二者配对使用,完成跨线程的结果传递和同步。
二、核心设计:共享状态(Shared State)
std::promise 和 std::future 的底层通信依赖共享状态(Shared State),这是一个线程安全的、堆上分配的内部对象,也是二者协作的核心载体,其核心特性如下:
- 关联关系:
promise构造时会创建一个新的共享状态,调用promise::get_future()后,future会与该共享状态绑定,二者共享同一个状态; - 状态标识:共享状态包含「未就绪(not ready)」「就绪(ready,存储值)」「就绪(ready,存储异常)」三种核心状态,初始为「未就绪」;
- 线程安全:共享状态的所有操作(设置值/异常、获取值/异常、状态判断)都是线程安全的,无需用户额外加锁;
- 生命周期:共享状态的生命周期独立于
promise和future,会持续到最后一个关联的对象(promise/future/shared_future)被销毁或显式释放,即使创建它的promise先被销毁,只要有future关联,共享状态就会存活。
共享状态的核心数据
共享状态内部至少包含以下关键数据:
- 结果存储区:用于保存
promise设置的值(类型 T) 或异常(std::exception_ptr 类型); - 状态标志位:标记当前是「未就绪」「值就绪」还是「异常就绪」;
- 等待队列:存储阻塞在该共享状态上的线程(用于
future::get()/wait()等操作的阻塞与唤醒); - 引用计数器:统计关联的
promise/future数量,用于管理生命周期。
三、promise 与 future 的协作流程
二者的协作是典型的「生产者 - 消费者」模型,promise 是生产者,future 是消费者,核心流程基于共享状态的状态转换,步骤如下:
- 创建共享状态:主线程创建
std::promise<T>对象,此时自动创建一个「未就绪」状态的共享状态; - 绑定 future:调用
promise.get_future(),得到std::future<T>对象,该future与上述共享状态绑定; - 传递 future:将 对象传递给工作线程(可通过值传递/引用传递,推荐配合 避免拷贝), 保留在生产者线程(主线程/其他工作线程);

