future和shared_future有什么区别?

Aje*_*nga 31 c++ multithreading mutex c++11

future和之间有什么区别shared_future
在什么情况下我们必须使用shared_future而不是future

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

这是我目前对差异的理解

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

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

欢迎提供更多信息,陷阱或一般指导方针......

How*_*ant 36

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

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

A
make_A()
{
    A a;
    // ...
    return a;
}
Run Code Online (Sandbox Code Playgroud)

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

但是如果你尝试同时执行会发生什么make_A,比如使用期货.那岂不是如果你只能并行的罪行make_A,如果ACopyConstructible?!你不得不在追逐另一个时放弃一个优化!

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

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

  • 因此,不仅shared_future <R>中的R必须是copyConstructible,它们实际上是被复制的,而在将来的<R>中,访问不会进行复制而只会移动.所以这意味着,默认使用future <R>,因为它更快,并且必须时使用shared_future <R>.正确吗? (4认同)
  • @Ajeet:这实际上是'future`和`shared_future`命名的精确推理.一开始有'unique_future`和`shared_future`,关于哪一个应该是"默认"有很多讨论.无论哪个应该是默认值,那个应该被命名为"future".在做出这个决定的时候,移动语义对于C++委员会来说仍然是一个新的东西,并没有那么好理解.我认为C++委员会在将"未来"的简单名称分配给"unique_future"方面有了明智的飞跃. (3认同)