概念简介
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;
}
运行结果:文章来源:https://www.toymoban.com/news/detail-648270.html
Main Thread id = 140052716861248
Func Thread id = 140052716857088
Result = -1
补充
与std::packaged_task
相比,std::async
不仅可以打包一个异步任务,std::launch::async
策略下还可以帮忙创建一个新线程并执行任务,某些场景下比std::packaged_task
方便一些。文章来源地址https://www.toymoban.com/news/detail-648270.html
到了这里,关于C++11 异步与通信之 std::async的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!