std::async是C++提供的一个异步处理函数。
函数原型:
template<typename _Fn, typename... _Args>
future<__async_result_of<_Fn, _Args...>> async(launch __policy, _Fn&& __fn, _Args&&... __args);
参数说明:
int thFun(int k);
std::future<int> result=std::async(std::launch::async, thFun, 10);
第一个参数是启动策略的设置: launch::async为异步:启用新线程来执行。
launch::deferred:同步执行,还在原来的线程中,对__fn的调用被延迟,直到future使用wait()或get()。不调用这future get()或wait()将不阻塞程序。
第二个参数:需要执行的函数。
后面参数为执行函数的参数。
返回值:操作结果,定义时候记得数据类型得与执行函数的返回值类型一致。
可以使用future的get、wait、wait_for、wait_until等待执行结束,其中get可以获得执行的结果。如果选择launch::async异步执行,调用get时,如果异步执行没有结束,get会阻塞当前调用线程,直到异步执行结束并获得结果,如果异步执行已经结束,直接获得结果;如果选择launch::deferred同步执行,只有当调用get函数时,同步调用的函数才真正执行,否则不执行。
异步调用:
int thFun(int k)
{
for (int i=0;i<k;i++)
{
cout << i<<endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
return 5;
}
int main()
{
std::future<int> result=std::async(std::launch::async, thFun, 10);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
cout << "主函数启动线程结束" << endl;
}
验证异步调用使用了结果get(),阻塞。
std::future<int> result=std::async(std::launch::async, thFun, 10);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
result.get();
cout << "主函数启动线程结束" << endl;
同步调用但是不使用get()
std::future<int> result=std::async(std::launch::deferred, thFun, 10);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
cout << "主函数启动线程结束" << endl;
结果验证了不调用get函数是不会执行异步函数的,也就是不会阻塞到调用的线程。
同步调用但是使用get()
std::future<int> result=std::async(std::launch::deferred, thFun, 10);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
cout<<"调用结果:"<<result.get() <<endl ;
cout << "主函数启动线程结束" << endl;