赞
踩
在前文C++11笔记-多线程-初识-async()和Future中,初次使用async()和Future来实现一个多线程的demo;
本文是在学习《C++标准库》时,做的笔记;
在上一文中讲到,async()是尝试启动被调用的函数;用《C++标准库》的话来说,async()是个辅助函数,用来在分离线程中启动某个函数(如果可能的话,例如单线程系统就不可能);所以如果底层平台支持多线程,你可以让函数并发运转;如果底层平台不支持,也没有任何损失,就是从并行编程模型退化到串行编程模型,从异步执行退化到同步执行;
future async(std::launch::async, F func, args…)
使用get()方法获取结果:
cout << "starting func1() in background" << " and func2() in foreground:" << endl;
future<int> result1(async(std::launch::async, func1));
int result2 = func2();
int result = result1.get() + result2;
cout << "\n result of func1()+func2(): " << result << endl;
执行结果:
当future对象被销毁:
{future<int> result1(async(std::launch::async, func1)); }
int result2 = func2();
由于result1对象销毁时,需要阻塞程序,直到func1函数执行完毕后;
执行结果:
将async设置为推迟执行模式;
cout << "starting func1() in background" << " and func2() in foreground:" << endl;
future<int> result1(async(std::launch::deferred, func1));
int result2 = func2();
int result = result1.get() + result2;
cout << "\n result of func1()+func2(): " << result << endl;
可以发现在func2执行完毕后,直到调用了result.get()函数后,func1的内容才打印在窗口上;
执行结果:
async()作为多线程编程的高级接口,接口简单易用,能够让新手快速入门多线程编程;
需要注意的是立即发射模式、推迟执行模式以及默认的混合模式,三个不同模式时对future的操作以及错误异常信息;
1.《C++标准库》第二版;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。