std::promise

来自cppreference.com
< cpp‎ | thread
 
 
并发支持库
线程
(C++11)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
协作式取消
互斥
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩与屏障
(C++20)
(C++20)
未来体
promise
(C++11)
(C++11)
(C++11)
安全回收
风险指针
原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 弃用)
(C++11)(C++20 弃用)
内存定序
(C++11)(C++26 弃用)
原子操作的自由函数
原子标志的自由函数
 
 
在标头 <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 只应当使用一次。

每个承诺体都与一个共享状态 关联,其中含有一些状态信息和一个结果,它可能尚未求值,已求值为一个值(可能为 void),或者求值为一个异常。承诺可以对共享状态做三件事:

  • 使就绪:承诺体存储结果或异常于共享状态。标记共享状态为就绪,并除阻在该共享状态所关联的未来体上等待的任何线程。
  • 释放:承诺体放弃其对共享状态的引用。若这是最后一个这种引用,则销毁共享状态。除非这是 std::async 所创建的未就绪的共享状态,否则此操作不阻塞。
  • 抛弃:承诺体存储以 std::future_errc::broken_promise 为错误码的 std::future_error 类型的异常,令共享状态为就绪,然后释放它。

承诺体是承诺体-未来体交流通道的“推”端:向共享状态存储值的操作同步于(定义于 std::memory_order)任何在共享状态上等待的函数(如 std::future::get)的成功返回。其他情况下对共享状态的共时访问可能冲突:例如,std::shared_future::get 的多个调用方必须全都是只读,或提供外部同步。

目录

[编辑]成员函数

构造承诺体对象
(公开成员函数)[编辑]
析构承诺体对象
(公开成员函数)[编辑]
赋值共享状态
(公开成员函数)[编辑]
交换两个承诺体对象
(公开成员函数)[编辑]
获取结果
返回与承诺的结果关联的 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();// 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
close