2013-04-14 34 views
26

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

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

这是我目前的分歧

  1. future对象可以一次为get()查询了解。
  2. shared_future可以查询任意次数。

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

的任何详细信息,陷阱或一般准则,欢迎...

回答

30

这两种类型的未来的动机可以追溯到移动语义,将只类型和新的C++ 11功能回到举动 - 仅来自普通功能的类型。

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

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

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

但是,如果您尝试同时执行make_A会发生什么情况,比如使用期货。如果你只能并行make_A if ACopyConstructible?你将不得不放弃一个优化,而追逐另一个!

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

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

+4

因此,不仅在shared_future 中的R必须是copyConstructible,它们实际上是被复制的,在将来中,访问将不会复制并且只能移动。 这意味着,默认情况下使用未来的,因为它更快,并且在必要时使用shared_future 。正确吗? –

+3

@Ajeet:这实际上是“future”和“shared_future”命名的确切推理。一开始有'unique_future'和'shared_future',关于哪一个应该是“默认”有很多讨论。无论哪一个应该是默认的,那个应该被命名为“未来”。在做这个决定的时候,移动语义对C++委员会来说还是很新的,而且这一点还不是很好理解。我相信C++委员会将明智的“未来”名称分配给“unique_future”,这是一种明智的信心飞跃。 –