std::async Tutorial & Example

std::async Tutorial & Example

本文将介绍在C++11中如何执行异步任务。

what is std::async()

std::async()是一个函数模版,可以接收一个回调作为参数,并异步执行该函数。

1
2
template <class Fn, class... Args>
future<typename result_of<Fn(Args...)>::type> async (launch policy, Fn&& fn, Args&&... args);

返回值是一个future对象,该对象存着异步执行的函数的返回值。

第一个参数launch policy是一个启动策略,它控制着异步执行的行为,我们可以创建三种异步启动的策略:

  • std::launch::async:传递进来的函数在独立的线程中执行;
  • std::launch::deferred:只有某个线程对future对象调用get()的时候才会调用函数;
  • std::launch::async | std::launch::deferred:默认行为;

我们可以传递以下的回调到std::async中:

  • 函数指针;
  • 函数对象;
  • lambda函数;

假设这样的一个场景,异步调用函数:

1
2
3
4
5
6
7
std::future<std::string> resultFromDB = std::async(std::launch::async, fetchDataFromDB, "Data");

// Do Some Stuff

//Fetch Data from DB
// Will block till data is available in future<std::string> object.
std::string dbData = resultFromDB.get();

std::async()的行为如下:

  1. 自动创建一个线程或者从线程池中获取一个,还会有创建一个promise对象;
  2. 然后将promise对象传递进线程,并返回future对象;
  3. 当传递进的参数,即函数退出时,它的返回值会被promise对象给设置进去;