访问异步操作结果-future

一、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;
}

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/81173303