Namespaces
Variants

std:: promise

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
promise
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
定义于头文件 <future>
template < class R > class promise ;
(1) (C++11 起)
template < class R > class promise < R & > ;
(2) (C++11 起)
template <> class promise < void > ;
(3) (C++11 起)
1) 基础模板。
2) 非 void 特化,用于在线程间传递对象。
3) void 特化,用于传递无状态事件。

类模板 std::promise 提供了一种存储值或异常的机制,该值或异常随后可通过由 std::promise 对象创建的 std::future 对象进行异步获取。请注意 std::promise 对象仅设计为单次使用。

每个 promise 都与一个 共享状态 相关联,该状态包含某些状态信息和一个 结果 ,该结果可能尚未求值、已求值为某个值(可能为 void)或已求值为异常。promise 可以通过共享状态执行三种操作:

  • 准备就绪 :promise 将结果或异常存储于共享状态中。将状态标记为就绪,并解除任何等待该共享状态关联 future 的线程阻塞。
  • 释放 :promise 放弃其对共享状态的引用。若此为最后一个引用,则共享状态被销毁。除非是由尚未就绪的 std:: async 创建的共享状态,否则此操作不会阻塞。
  • 弃置 :promise 存储类型为 std::future_error 的异常(错误码为 std::future_errc::broken_promise ),使共享状态 准备就绪 ,随后将其 释放

promise 是 promise-future 通信通道的"推送"端:该操作在共享状态中存储值的行为与任何等待该共享状态的函数(如 std::memory_order )成功返回之间建立 同步关系 (按 std::future::get 中的定义)。否则对同一共享状态的并发访问可能产生冲突:例如多个 std::shared_future::get 调用方必须全部为只读操作或提供外部同步机制。

目录

成员函数

构造 promise 对象
(公开成员函数)
析构 promise 对象
(公开成员函数)
赋值共享状态
(公开成员函数)
交换两个 promise 对象
(公开成员函数)
获取结果
返回与承诺结果关联的 future
(公开成员函数)
设置结果
设置结果为指定值
(公开成员函数)
设置结果为指定值,仅在线程退出时传递通知
(公开成员函数)
设置结果以指示异常
(公开成员函数)
设置结果以指示异常,仅在线程退出时传递通知
(公开成员函数)

非成员函数

特化 std::swap 算法
(函数模板)

辅助类

特化 std::uses_allocator 类型特征
(类模板特化)

示例

本示例展示如何将 promise<int> 用作线程间的信号传递机制。

#include <chrono>
#include <future>
#include <iostream>
#include <numeric>
#include <thread>
#include <vector>
void accumulate(std::vector<int>::iterator first,
                std::vector<int>::iterator last,
                std::promise<int> accumulate_promise)
{
    int sum = std::accumulate(first, last, 0);
    accumulate_promise.set_value(sum); // 通知 future 对象
}
void do_work(std::promise<void> barrier)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    barrier.set_value();
}
int main()
{
    // 演示使用 promise<int> 在线程间传递计算结果
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
    std::promise<int> accumulate_promise;
    std::future<int> accumulate_future = accumulate_promise.get_future();
    std::thread work_thread(accumulate, numbers.begin(), numbers.end(),
                            std::move(accumulate_promise));
    // future::get() 将等待直到 future 包含有效结果并获取该值
    // 在调用 get() 之前无需显式调用 wait()
    // accumulate_future.wait(); // 等待结果
    std::cout << "result=" << accumulate_future.get() << '\n';
    work_thread.join(); // 等待线程完成
    // 演示使用 promise<void> 在线程间进行状态通知
    std::promise<void> barrier;
    std::future<void> barrier_future = barrier.get_future();
    std::thread new_work_thread(do_work, std::move(barrier));
    barrier_future.wait();
    new_work_thread.join();
}

输出:

result=21