比起packaged_task的方式来实现函数的异步调用,async可以以一种更为方便的方式来控制函数的调用:
templatefuture ::type> async(launch policy, Fn&& fn, Args&&...args); 参数: policy:用于指定函数是调用策略 1. std::launch::async 传递的可调用对象异步执行; 2. std::launch::deferred 传递的可调用对象同步执行; 3. std::launch::async | std::launch::deferred 可以异步或是同步,取决于操作系统,我们无法控制; 4. 如果我们不指定策略,则相当于(3) fn:函数,lambda函数,函数对象等 args:函数fn的调用参数 返回值: 基于fn返回值类型的future对象
launch::async:异步调用,async对象在构造后,会新创建一个线程用于执行函数fn,并传递参数args,主线程可通过future::get获得函数fn异步执行的返回值,在函数fn未返回前,future::get会处于阻塞状态:
#include#include #include #include #include using namespace std; unsigned long getTime() { return chrono::system_clock::now().time_since_epoch().count()/chrono::system_clock::period::den; } int add(int a, int b) { cout< fu1 = async(launch::async, add, 1, 2); cout< launch::deferred:同步调用async对象在构造后不会创建线程执行fn,直到通过future::get调用时才会同步的调用函数fn,在fn完成返回后,主线程才能继续执行:
#include#include #include #include #include using namespace std; unsigned long getTime() { return chrono::system_clock::now().time_since_epoch().count()/chrono::system_clock::period::den; } int add(int a, int b) { cout< fu1 = async(launch::deferred, add, 1, 2); cout< 对于异步调用,除了可以使用get来阻塞等待返回结果外,还可以通过wait,wait_for, wait_until来等待异步调用的完成,这几个函数可以返回当前的future状态:
1. deffered:异步操作还没有完成;
2. ready:异步操作已经完成;
3. timeout:异步操作超时。
#include#include #include #include #include using namespace std; unsigned long getTime() { return chrono::system_clock::now().time_since_epoch().count()/chrono::system_clock::period::den; } int add(int a, int b) { cout< fu1 = async(launch::async, add, 1, 2); cout<



