C++并行处理支持库 之六
C++并行处理支持库 之六
- std::promise
- 构造器
- APIs
- 应用实例
通过使用Futures标准库,我们可以获取异步任务返回值,捕获异步任务引发的异常。异步任务就是在独立线程中启动运行的函数。
这些值以共享状态进行通信,其中异步任务可以写入其返回值,或存储异常,并且可以其他线程检查、等待或以其他方式操作,这些线程包含std::future或std::shared_future实例,而std::future或std::shared_future引用该共享状态。
std::promise
template< class R > class promise;
template< class R > class promise<R&>;
template<> class promise;
构造器
构造器 | 意义 |
---|---|
promise() | 默认构造函数。使用空的共享状态构造 Promise |
template< class Alloc > promise( std::allocator_arg_t, const Alloc& alloc ) | 使用空的共享状态构造 Promise。共享状态是使用alloc分配的。 Alloc必须满足Allocator的要求 |
promise( promise&& other ) noexcept | 移动构造函数。使用移动语义与other的共享状态构建 Promise。构建后,other没有共享状态。 |
promise( const promise& other ) = delete | Promise不可复制 |
APIs
API | 说明 |
---|---|
get_future | 返回与promise结果相关的future |
set_value | 将结果设置为特定值 |
set_value_at_thread_exit | 将结果设置为特定值,同时仅在线程退出时,传递通知 |
set_exception | 设置结果,以指示异常 |
set_exception_at_thread_exit | 设置结果,以指示异常,同时仅在线程退出时,传递通知 |
应用实例
下面展示一些 内联代码片
。
#include <iostream>
#include <thread>
#include <vector>
#include <future>
#include <numeric>
using namespace std;
void acc_f(vector<int> &num_v,
promise<int> accumulate_promise)
{
int sum = accumulate(num_v.begin(), num_v.end(), 0);
accumulate_promise.set_value(sum); // Notify future
}
void do_work(promise<void> barrier)
{
std::this_thread::sleep_for(std::chrono::seconds(1));
cout << "do_work done !!!" << endl;
barrier.set_value(); // Notify future
}
int main()
{
// promise<int> to transmit a result between threads.
vector<int> numbers = {1, 12, 3, 4, 15, 61};
promise<int> accumulate_promise;
future<int> accumulate_future = accumulate_promise.get_future();
thread work_thread(acc_f, ref(numbers), move(accumulate_promise));
cout << "result=" << accumulate_future.get() << '\n';
work_thread.join(); // wait for thread completion
// promise<void> to signal state between threads.
promise<void> barrier;
future<void> barrier_future = barrier.get_future();
thread t2(do_work, move(barrier));
barrier_future.wait();
t2.join();
}
result=96
do_work done !!!