C++11异步与通信之std::async的使用
作者:KingOfMyHeart
std::async 异步运行一个函数,将返回值保存在std::future中,本文主要介绍了C++11异步与通信之std::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方便一些。
到此这篇关于C++11异步与通信之std::async的使用的文章就介绍到这了,更多相关C++11 std::async内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!