C++中的std::async 和 std::future 在 camera HAL 中的使用

又是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 - 博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值