future和shared_future有什么区别?

时间:2013-04-14 23:43:50

标签: c++ multithreading c++11 mutex

futureshared_future之间的区别是什么? 在哪些情况下,我们必须使用shared_future而不是future

我试图找到与C ++ 11的这两个功能形成鲜明对比的好文档,而我在网上找不到答案(至少容易/可读)。

这是我目前对差异的理解

  1. future对象只能查询get()
  2. 一次
  3. shared_future可以被多次查询。
  4. 用例: 如果多个线程依赖于异步任务的结果,那么我们必须使用shared_future。 如果需要在同一个线程中多次查询将来的对象,那么我们必须使用shared_future代替。

    欢迎任何更多信息,陷阱或一般准则......

1 个答案:

答案 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只需要MoveConstructibleshared_future<R>。但是你只能得到一次,因为你正在从存储的结果中移动。

但是为多个线程获得相同的结果也是一个真正的需求。因此R允许这样做,但要求CopyConstructible为{{1}}。