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