又是mtk代码,简单学习扫盲一下
首先要知道这里面的几个不认识的关键字都分别是什么玩意
先从了解std::async开始
简单来说async是一个函数,对于一个函数我们首先当然关注它的参数和返回值
- 它的参数有:
第二个参数 func 是一个可调用的对象,如函数、函数指针、lambda表达式等等(上图中就是一个lambda表达式)
func后的参数则是作为func的参数传入
第一个参数指定了上述可调用对象func的执行策略,有以下几种选项:
- std::launch::async:异步执行func,让func在一个新的线程中运行
- std::launch::deferred:同步执行func,当要访问func结果的时候才去调用
- 不指定策略的话,无法控制func是异步还是同步执行
- 它的返回值是:
std::future,这个类的对象维护了func的执行结果和这个结果的状态,当func执行结束后,可以调用future的get成员函数来获取func的执行结果,关于get函数可以参考这里的详细解释:
(1).当共享状态就绪时,返回存储在共享状态中的值(或抛出异常)。
(2).如果共享状态尚未就绪(即提供者尚未设置其值或异常),则该函数将阻塞调用的线程直到就绪。
(3).当共享状态就绪后,则该函数将取消阻塞并返回(或抛出)释放其共享状态,这使得future对象不再有效,因此对于每一个future共享状态,该函数最多应被调用一次。
(4).std::future<void>::get()不返回任何值,但仍等待共享状态就绪并释放它。
(5).共享状态是作为原子操作(atomic operation)被访问。
关于std::future还有很多要讲的,在这里就不展开了,这张图说得很清楚:
回到代码,有了上面的知识储备,大概就能看懂下面的内容:
首先mvOpenFutures是一个装future对象的vector,这里压入了async函数返回的future对象
由第一个参数可以看出,这个async函数异步启动后面的lambda表达式
这个lambda表达式捕获了this指针,也就是能在函数体中可见当前类的所有变量
既然是异步执行的这个lambda表达式,则函数体中多半是一些不能及时返回的耗时操作,这些操作做了什么就不在本次讨论范围内了
在介绍std::future的时候说到当lambda表达式执行结束后,可以调用future的get成员函数来获取执行结果
那么这个执行结果在哪里被get访问到呢
符合逻辑
参考:
https://www.jb51.net/article/198761.htm
C++11之std::future对象使用说明_Jimmy1224的博客-CSDN博客_c++ future
C++11 并发指南四(<future> 详解三 std::future & std::shared_future) - Haippy - 博客园