future 和 shared_future 有啥区别?
Posted
技术标签:
【中文标题】future 和 shared_future 有啥区别?【英文标题】:What is the difference between future and shared_future?future 和 shared_future 有什么区别? 【发布时间】:2013-04-14 23:43:49 【问题描述】:future
和 shared_future
有什么区别?
在什么情况下我们必须使用shared_future
而不是future
?
我试图找到可以对比 C++11 的这两个特性的好的文档,但我在网络上找不到答案(至少容易/可读)。
这是我目前对差异的理解
future
对象只能查询一次 get()
。
shared_future
可以查询任意次数。
用例:
如果多个线程依赖于一个异步任务的结果,那么我们必须使用shared_future
。
如果需要在同一个线程中多次查询未来对象,那么我们必须使用shared_future
。
欢迎提供更多信息、陷阱或一般指南...
【问题讨论】:
【参考方案1】:这两种未来类型的动机可以追溯到移动语义、只移动类型和新的 C++11 特性,即从普通函数返回只移动类型。
在 C++98/03 中,如果你想从工厂函数返回一个类型:
A
make_A()
A a;
// ...
return a;
那么A
必须是CopyConstructible
。那么,全新的 C++11,即使不是CopyConstructible
,我们也可以返回A
,只要是MoveConstructible
即可。
但是如果你尝试同时执行make_A
会发生什么,比如使用期货。如果A
是CopyConstructible
,你只能并行化make_A
,这不是犯罪吗?!您将不得不放弃一种优化而追求另一种优化!
所以future<R>
只需要R
是MoveConstructible
。但是您只能获取一次,因为您正在从存储的结果中移动。
但是为多个线程获得相同的结果也是一个真正的需求。所以shared_future<R>
允许这样做,但要求R
是CopyConstructible
。
【讨论】:
因此,不仅 shared_futurefuture
和shared_future
命名的确切原因。一开始有unique_future
和shared_future
,关于哪个应该是“默认”有很多讨论。无论哪个应该是默认值,那个应该被命名为“未来”。在做出这个决定的时候,移动语义对于 C++ 委员会来说还是很新的东西,而且还不是很好理解。我相信 C++ 委员会在将“future”这个更简单的名称分配给“unique_future”方面有着明智的信念。以上是关于future 和 shared_future 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
第27课 “共享状态”及其管理者(std::future/std::shared_future)
C++并发与多线程 10_shared_futureautomic