C++11 异步编程std::future, std::promise, std::pakaged_task以及std::async

本文介绍了C++11中用于异步编程的std::future、std::promise、std::packaged_task和std::async。std::future和std::promise作为一对对象,通过条件变量管理状态,实现线程间通信。std::packaged_task是对std::promise和std::future的封装,将任务和承诺绑定。std::async则提供了更加便捷的异步执行方式,自动管理线程资源,但使用时需要注意future对象的生命周期管理,以避免阻塞事件循环。
摘要由CSDN通过智能技术生成

引入

C++11 已经为我们提供了std::thread如此方便的多线程API,为啥还要“多此一举”地提供一大堆异步编程库呢?
哈哈, 其实制定C++11 规范的那些神人们考虑的比我们有远见多了
你想啊, 如果我们平时使用std::thread来进行异步调用的时候,需要获取异步调用的结果,那该怎么办呢?
如果使用全局加锁变量, 那我们有从何得知线程是否完成呢?

标准库方案

std::promisestd::future

从字面意思上看, 表示承诺和将来, 对, 就跟咱们某些小情侣之间的海誓山盟差不多。
“我许你承诺, 在将来的某一天定会给你个惊喜"。

小情侣间的海誓山盟我不知道靠不靠谱,但std::promise和std::future我是可以保证肯定靠谱的

实现原理与如何使用

  • 实现的方式其实很简单,一个使用条件变量的状态管理器加上一个存储值。

当存储值的时候,标记以接收,并通知条件变量
当获取值的时候,首先等待条件变量,准备好之后返回接收的值

  • 如何理解

首先我们需要明确一个重要概念 有了承诺才会有将来, 也就是说,承诺和将来是有严格的时许关系的: 只有承诺的给到了,才能有将来。可能标准库的制定者也是觉得这个工具的特性很相似,所以才起这个名字的吧

  1. promise和future必须成对使用
  2. 可以将这一对对象理解成一条一次性单向管道,promise和future分别代表管道的两个口,promise为入口,future为出口,只有入口放置了我们需要的值,出口才能接收到
  3. 管道的两个可以位于不同线程,每个线程相当于一个人,可以是一个人给另一个人承诺,有另一个人来等待将来
  4. 管道也可以位于同一个线程,相当于自己给做的事做个总结,总结做好了先放着,去做完其他的事再来拿自己的总结(先给promise设置值, 再获取future)。如果行为反了,就会出现事还没做却在傻等自己的总结
  • 如何使用
std::promise<int> pro;
std::future<int> f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值