2017-06-04 34 views
6

Poniższy przykład pochodzi z C++ async tutorial:Jak wykorzystać przyszłość, nie czekając na nią?

#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; 
} 

Jak mogę wykorzystać jego wynik future nie czekając na niego? Tzn chciałbym zrobić coś takiego:

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

mogę przekazać referencję do future do someLengthyCalculation, ale w pewnym momencie muszę zadzwonić get pobrać wartość, więc nie wiem jak to napisać bez czekania na zakończenie pierwszego elementu, zanim następny będzie mógł rozpocząć sumowanie.

+0

Szukasz czegoś podobnego 'then' i' when_all' lub 'when_any' kontynuacje ? – kreuzerkrieg

Odpowiedz

4

Masz rację, że obecna biblioteka future nie jest jeszcze ukończona. To, czego nam brakuje, to sposób na wskazanie "kiedy przyszłość x jest gotowa, rozpocznij operację f". Oto ładny post about that.

Czego możesz chcieć to mapa/zmniejszyć implementację: po zakończeniu każdej przyszłości chcesz zacząć dodawać ją do akumulatora (zmniejszyć).

Możesz użyć do tego biblioteki - zbudowanie jej nie jest łatwe :). Jedną z bibliotek, które zyskują trakcję, jest RxCpp - i mają one post on map/reduce.

1

Konstrukcja futures nadaje się do tego rodzaju rozwiązania, gdzie można tworzyć kolejne kontrakty reprezentujące obliczone wartości:

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

Być może jest to bardziej z odpowiedzi na OP pomaga ... Podpowiedź: std :: przekształć kontrakty futures na calcul_futures, aby lepiej wyrazić zamiar. – xtofl