future和shared_future的区别是什么?

What is the difference between future and shared_future?

本文关键字:future 是什么 区别 shared      更新时间:2023-10-16

futureshared_future的区别是什么?
在什么情况下我们必须用shared_future而不是future ?

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

这是我目前对差异的理解

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

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

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

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

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

A必须是CopyConstructible。然后,在c++ 11中全新的,我们可以返回A,即使它不是CopyConstructible,它只需要是MoveConstructible

但是如果你试图同时执行make_A,比如使用期货,会发生什么呢?如果你只能在ACopyConstructible的情况下并行make_A,这不是犯罪吗?你将不得不在追逐另一个优化时放弃一个优化!

所以future<R>只要求RMoveConstructible。但是你只能得到它一次,因为你从存储的结果中移动。

但是对于多个线程获得相同的结果也是真正需要的。所以shared_future<R>允许,但要求RCopyConstructible