一、std::future
通常一个异步操作我们是不能马上就获取操作结果的,只能在未来某个时候获取。我们可以以同步等待的方式来获取结果,可以通过查询future的状态(future_status)来获取异步操作的结果。future_status有三种状态:
1. deferred:异步操作还没开始;
2. ready:异步操作已经完成;
3. timeout:异步操作超时。
获取future结果有三种方式:get、wait、wait_for,其中get等待异步操作结束并返回结果,wait只是等待异步操作完成,没有返回值,wait_for是超时等待返回结果。
二、std::promise
promise 对象可以保存某一类型 T 的值,该值可被 future 对象读取(可能在另外一个线程中),因此 promise 也提供了一种线程同步的手段。在 promise 对象构造时可以和一个共享状态(通常是std::future)相关联,并可以在相关联的共享状态(std::future)上保存一个类型为 T 的值。可以通过 get_future 来获取与该 promise 对象相关联的 future 对象,调用该函数之后,两个对象共享相同的共享状态(shared state)
1. promise 对象是异步 Provider,它可以在某一时刻设置共享状态的值;
2. future 对象可以异步返回共享状态的值,或者在必要的情况下阻塞调用者并等待共享状态标志变为 ready,然后才能获取共享状态的值。
三、demo
#include <iostream> // std::cout
#include <functional> // std::ref
#include <thread> // std::thread
#include <future> // std::promise, std::future
//获取future结果有三种方式:get、wait、wait_for,其中get等待异步操作结束并返回结果,
//wait只是等待异步操作完成,没有返回值,wait_for是超时等待返回结果。
void print_int(std::future<int>& fut)
{
int x = fut.get(); // 获取共享状态的值。
std::cout << "value: " << x << '\n'; // 打印 value: 10。
}
int main ()
{
std::promise<int> prom; // 生成一个 std::promise<int> 对象。
std::future<int> fut = prom.get_future(); // 和 future 关联。
std::thread t(print_int, std::ref(fut)); // 将 future 交给另外一个线程t。
prom.set_value(10); // 设置共享状态的值, 此处和线程t保持同步。
t.join();
return 0;
}