概念简介
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
方便一些。