futureshared_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_AA的情况下并行化CopyConstructible,那不是犯罪吗?您将不得不放弃一种优化而追逐另一种!

    因此future<R>仅要求RMoveConstructible。但是您只能获得一次,因为您正在从存储结果中移出。

    但是,对于多个线程也要获得相同的结果也是一个真正的需求。因此shared_future<R>允许这样做,但要求RCopyConstructible

    09-09 23:47