引入
C++11 已经为我们提供了std::thread如此方便的多线程API,为啥还要“多此一举”地提供一大堆异步编程库呢?
哈哈, 其实制定C++11 规范的那些神人们考虑的比我们有远见多了
你想啊, 如果我们平时使用std::thread来进行异步调用的时候,需要获取异步调用的结果,那该怎么办呢?
如果使用全局加锁变量, 那我们有从何得知线程是否完成呢?
标准库方案
std::promise
和 std::future
从字面意思上看, 表示承诺和将来, 对, 就跟咱们某些小情侣之间的海誓山盟差不多。
“我许你承诺, 在将来的某一天定会给你个惊喜"。
小情侣间的海誓山盟我不知道靠不靠谱,但std::promise和std::future我是可以保证肯定靠谱的
实现原理与如何使用
- 实现的方式其实很简单,一个使用条件变量的状态管理器加上一个存储值。
当存储值的时候,标记以接收,并通知条件变量
当获取值的时候,首先等待条件变量,准备好之后返回接收的值
- 如何理解
首先我们需要明确一个重要概念
有了承诺才会有将来
, 也就是说,承诺和将来是有严格的时许关系的: 只有承诺的给到了,才能有将来。可能标准库的制定者也是觉得这个工具的特性很相似,所以才起这个名字的吧
- promise和future必须成对使用
- 可以将这一对对象理解成一条一次性单向管道,promise和future分别代表管道的两个口,promise为入口,future为出口,只有入口放置了我们需要的值,出口才能接收到
- 管道的两个可以位于不同线程,每个线程相当于一个人,可以是一个人给另一个人承诺,有另一个人来等待将来
- 管道也可以位于同一个线程,相当于自己给做的事做个总结,总结做好了先放着,去做完其他的事再来拿自己的总结(先给promise设置值, 再获取future)。如果行为反了,就会出现事还没做却在傻等自己的总结
- 如何使用
std::promise<int> pro;
std::future<int> f