future
和shared_future
之间的区别是什么?
在哪些情况下,我们必须使用shared_future
而不是future
?
我试图找到与C ++ 11的这两个功能形成鲜明对比的好文档,而我在网上找不到答案(至少容易/可读)。
这是我目前对差异的理解
future
对象只能查询get()
。shared_future
可以被多次查询。shared_future
。
如果需要在同一个线程中多次查询将来的对象,那么我们必须使用shared_future
代替。
欢迎任何更多信息,陷阱或一般准则......
答案 0 :(得分:35)
这两种未来类型的动机可以追溯到移动语义,仅移动类型和新的C ++ 11特性,以从普通函数返回仅移动类型。
在C ++ 98/03中,如果要从工厂函数返回类型:
A
make_A()
{
A a;
// ...
return a;
}
然后A
必须是CopyConstructible
。然后,在C ++ 11中全新,即使它不是A
,我们也可以返回CopyConstructible
,它只需要MoveConstructible
。
但是如果你尝试同时执行make_A
会发生什么,比如使用期货。如果make_A
A
CopyConstructible
只能并行future<R>
,那么这不是一种犯罪吗?你不得不在追逐另一个时放弃一个优化!
所以R
只需要MoveConstructible
为shared_future<R>
。但是你只能得到一次,因为你正在从存储的结果中移动。
但是为多个线程获得相同的结果也是一个真正的需求。因此R
允许这样做,但要求CopyConstructible
为{{1}}。