与 std::future
相关的函数主要是 std::async()
,原型如下:
unspecified policy (1) |
template <class Fn, class... Args> future<typename result_of<Fn(Args...)>::type> async(Fn&& fn, Args&&... args); |
---|---|
specific policy (2) |
template <class Fn, class... Args> future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&... args); |
上面两组 std::async()
的不同之处是第一类 std::async
没有指定异步任务(即执行某一函数)的启动策略(launch policy),而第二类函数指定了启动策略,详见 std::launch
枚举类型,指定启动策略的函数的 policy 参数可以是 launch::async
,launch::deferred
,以及两者的按位或( | )。
std::async()
的 fn
和 args
参数用来指定异步任务及其参数。另外,std::async()
返回一个 std::future
对象,通过该对象可以获取异步任务的值或异常(如果异步任务抛出了异常)。
下面介绍一下 std::async
的用法。
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <chrono>
#include <future>
#include <iostream>
double ThreadTask(int n) {
std::cout << std::this_thread::get_id()
<< " start computing..." << std::endl;
double ret = 0;
for (int i = 0; i <= n; i++) {
ret += std::sin(i);
}
std::cout << std::this_thread::get_id()
<< " finished computing..." << std::endl;
return ret;
}
int main(int argc, const char *argv[])
{
std::future<double> f(std::async(std::launch::async, ThreadTask, 100000000));
#if 0
while(f.wait_until(std::chrono::system_clock::now() + std::chrono::seconds(1))
!= std::future_status::ready) {
std::cout << "task is running...\n";
}
#else
while(f.wait_for(std::chrono::seconds(1))
!= std::future_status::ready) {
std::cout << "task is running...\n";
}
#endif
std::cout << f.get() << std::endl;
return EXIT_SUCCESS;
}