沈阳市建设公司网站,wordpress网站域名服务器,张家港网站建设培训,公众号的网站怎么做的概念简介
std::async 异步运行一个函数#xff0c;将返回值保存在std::future中。
含有2个策略参数#xff1a;
launch::deferred 延迟执行#xff0c;当调用wait()和get()时#xff0c;任务才会被运行#xff0c;且不创建线程#xff1b;launch::async : 创建线程并执…概念简介
std::async 异步运行一个函数将返回值保存在std::future中。
含有2个策略参数
launch::deferred 延迟执行当调用wait()和get()时任务才会被运行且不创建线程launch::async : 创建线程并执行任务默认是此类型同样的调用get()方法获取对象时也是阻塞等待的。
代码示例
使用deferred策略
int Func()
{std::cout Func Thread id std::this_thread::get_id() std::endl;return 0;
}int main()
{ std::cout Main Thread id std::this_thread::get_id() std::endl;//创建延迟任务这里不会启动新线程auto future std::async(std::launch::deferred, Func);//调用future.get()时才会去调用Func //读者可以试着把这行代码注释掉你会发现Func函数根本没有创建std::cout Result future.get() std::endl;;//通过打印线程id我们发现是在同一个线程中执行的没有创建新线程return 0;
}执行结果
Main Thread id 140646835402560
Result Func Thread id 140646835402560
0使用async策略
int Func(int n)
{std::cout Func Thread id std::this_thread::get_id() std::endl;return -1;
}int main()
{ std::cout Main Thread id std::this_thread::get_id() std::endl;//创建异步任务 使用默认策略 启动一个新线程//并且马上会执行异步任务代码auto future std::async(std::launch::async, Func, 100);//通过睡眠发现get()调用之前任务已经在被执行了std::this_thread::sleep_for(std::chrono::seconds(5));std::cout Result future.get() std::endl;;//通过打印线程id我们发现不是在同一个线程中执行的创建了新线程return 0;
}运行结果
Main Thread id 140052716861248
Func Thread id 140052716857088
Result -1补充
与std::packaged_task相比std::async不仅可以打包一个异步任务std::launch::async策略下还可以帮忙创建一个新线程并执行任务某些场景下比std::packaged_task方便一些。