std:: promise
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Getting the result | ||||
| Setting the result | ||||
| Non-member Functions | ||||
| Helper Classes | ||||
|
定义于头文件
<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 起) |
类模板
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
(公开成员函数) |
|
设置结果 |
|
|
设置结果为指定值
(公开成员函数) |
|
|
设置结果为指定值,仅在线程退出时传递通知
(公开成员函数) |
|
|
设置结果以指示异常
(公开成员函数) |
|
|
设置结果以指示异常,仅在线程退出时传递通知
(公开成员函数) |
|
非成员函数
|
(C++11)
|
特化
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