2017-06-04 119 views
6

下面的例子是從C++ async tutorial採取:如何在不等待的情況下使用未來?

#include <future> 
#include <iostream> 
#include <vector> 

int twice(int m) { return 2 * m; } 

int main() { 
    std::vector<std::future<int>> futures; 
    for(int i = 0; i < 10; ++i) { futures.push_back (std::async(twice, i)); } 

    //retrive and print the value stored in the future 
    for(auto &e : futures) { std::cout << e.get() << std::endl; } 
    return 0; 
} 

我如何使用future的結果,而無需等待呢?即我願做這樣的事情:

int sum = 0; 
    for(auto &e : futures) { sum += someLengthyCalculation(e.get()); } 

我能傳遞給futuresomeLengthyCalculation的引用,但在某些時候,我要叫get檢索值,因此,我不知道怎麼寫而不用等待第一個元素完成,然後下一個可以開始求和。

+0

您是否在尋找像'then'和'when_all'或'when_any'延續? – kreuzerkrieg

回答

4

你是正確的,目前future庫尚未完成。我們錯過的是一種表示'未來x準備就緒,開始操作f'的方式。這是一個不錯的post about that

你可能想要的是一個map/reduce實現:在每個將來完成時,你想開始將它添加到累加器(reduce)中。

您可以使用庫 - 它是不是很簡單建立它自己:)。其中一個正在獲得牽引力的圖書館是RxCpp--它們有post on map/reduce

1

期貨的設計適合於這種解決方案,讓您創建一個表示的計算值更期貨:

std::vector<std::future<int>> calculated_futures; 

    for (auto &e : futures) { 
     calculated_futures.push_back(
      std::async([&e]{ return someLengthyCalculation(e.get()); }) 
    ); 
    } 

    int sum = 0; 
    for(auto &e : calculated_futures) { sum += e.get(); } 
+0

也許這就是更多OP的答案。提示:std ::將期貨轉換爲calculate_futures以更好地表達意圖。 – xtofl

相關問題