33

future和 和有什么不一样shared_future
在什么情况下我们必须使用shared_future而不是future

我试图找到很好的文档来对比 C++11 的这两个特性,但我在网上找不到答案(至少容易/可读)。

这是我目前对差异的理解

  1. future对象只能被查询一次get()
  2. shared_future可以查询任意次数。

用例:如果多个线程依赖于异步任务的结果,那么我们必须使用shared_future. 如果需要在同一个线程中多次查询未来对象,那么我们必须使用它shared_future

欢迎任何更多信息、陷阱或一般指南...

4

1 回答 1

38

这两种未来类型的动机可以追溯到移动语义、只移动类型和新的 C++11 特性,即从普通函数返回只移动类型。

在 C++98/03 中,如果你想从工厂函数返回一个类型:

A
make_A()
{
    A a;
    // ...
    return a;
}

然后A不得不CopyConstructible。然后,在 C++11 中全新,A即使不是,我们也可以返回CopyConstructible,它只需要是MoveConstructible

但是如果你尝试同时执行会发生什么make_A,比如使用期货。如果只能并行化make_Aif Ais ,那不是犯罪CopyConstructible吗?!您将不得不放弃一种优化而追求另一种优化!

所以future<R>R需要MoveConstructible. 但是你只能得到一次,因为你正在从存储的结果中移动。

但是为多个线程获得相同的结果也是一个真正的需要。所以shared_future<R>允许这样做,但需要RCopyConstructible.

于 2013-04-15T00:02:28.810 回答