future 和 shared_future 有啥区别?

Posted

技术标签:

【中文标题】future 和 shared_future 有啥区别?【英文标题】:What is the difference between future and shared_future?future 和 shared_future 有什么区别? 【发布时间】:2013-04-14 23:43:49 【问题描述】:

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

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

这是我目前对差异的理解

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

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

欢迎提供更多信息、陷阱或一般指南...

【问题讨论】:

【参考方案1】:

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

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

A
make_A()

    A a;
    // ...
    return a;

那么A 必须是CopyConstructible。那么,全新的 C++11,即使不是CopyConstructible,我们也可以返回A,只要是MoveConstructible即可。

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

所以future<R> 只需要RMoveConstructible。但是您只能获取一次,因为您正在从存储的结果中移动。

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

【讨论】:

因此,不仅 shared_future 中的 R 必须是可复制构造的,它们实际上是被复制的,而在未来 中,访问不会复制而只会移动。这意味着,默认情况下使用 future,因为它更快,并且在必要时使用 shared_future。正确吗? @Ajeet:这实际上是提出futureshared_future 命名的确切原因。一开始有unique_futureshared_future,关于哪个应该是“默认”有很多讨论。无论哪个应该是默认值,那个应该被命名为“未来”。在做出这个决定的时候,移动语义对于 C++ 委员会来说还是很新的东西,而且还不是很好理解。我相信 C++ 委员会在将“future”这个更简单的名称分配给“unique_future”方面有着明智的信念。

以上是关于future 和 shared_future 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

第27课 “共享状态”及其管理者(std::future/std::shared_future)

C++并发与多线程 10_shared_futureautomic

c++11_14学习之future async promise

模型推理模板

模型推理模板

concurrent.futures 和 asyncio.futures 有啥区别?