定义于头文件
<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 对象异步获得结果。
每个 promise 与共享状态关联,共享状态含有一些状态信息和可能仍未求值的结果,它求值为值(可能为 void )或求值为异常。 promise 可以对共享状态做三件事:
promise 是 promise-future 交流通道的“推”端:存储值于共享状态的操作同步于(定义于 std::memory_order )任何在共享状态上等待的函数(如 std::future::get )的成功返回。其他情况下对共享状态的共时访问可能冲突:例如, std::shared_future::get 的多个调用方必须全都是只读,或提供外部同步。
目录 |
构造std::promise 对象 (公开成员函数) |
|
析构std::promise 对象 (公开成员函数) |
|
赋值共享状态 (公开成员函数) |
|
交换二个 promise 对象 (公开成员函数) |
|
获取结果 |
|
返回与承诺的结果关联的 future (公开成员函数) |
|
设置结果 |
|
设置结果为指定值 (公开成员函数) |
|
设置结果为指定值,同时仅在线程退出时分发提醒 (公开成员函数) |
|
设置结果为指示异常 (公开成员函数) |
|
设置结果为指示异常,同时仅在线程退出时分发提醒 (公开成员函数) |
(C++11)
|
特化 std::swap 算法 (函数模板) |
特化 std::uses_allocator 类型特性 (类模板特化) |
此示例展示能如何将 promise<int>
用作线程间信号。
#include <vector> #include <thread> #include <future> #include <numeric> #include <iostream> #include <chrono> 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)); accumulate_future.wait(); // 等待结果 std::cout << "result=" << accumulate_future.get() << '\n'; work_thread.join(); // wait for thread completion // 演示用 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