2013-04-14 59 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」,這是一種明智的信心飛躍。 –