2017-06-04 2 views
6

L'exemple suivant est tiré d'un C++ async tutorial:Comment utiliser un avenir sans l'attendre?

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

Comment puis-je utiliser le résultat d'un future sans attendre pour cela? -À-dire que je voudrais faire quelque chose comme ceci:

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

je pourrais passer une référence à la future-someLengthyCalculation, mais à un moment je dois appeler get pour récupérer la valeur, je ne sait donc comment l'écrire sans attendre que le premier élément soit terminé, avant que le prochain puisse commencer à faire la somme.

+0

Vous cherchez quelque chose comme '' then' et when_all' ou 'when_any' continuations ? – kreuzerkrieg

Répondre

4

Vous avez raison: la bibliothèque future actuelle n'est pas encore terminée. Ce qui nous manque, c'est un moyen d'indiquer «quand le futur x est prêt, lancez l'opération f». Voici un joli post about that. Ce que vous pouvez vouloir est une application de carte/réduire: à la fin de chaque futur, vous voulez commencer à l'ajouter à l'accumulateur (réduire).

Vous pouvez utiliser une bibliothèque pour cela - ce n'est pas très simple de le construire vous-même :). L'une des bibliothèques qui gagne du terrain est RxCpp - et ils ont un post on map/reduce.

1

La conception des contrats à terme se prête à ce genre de solution, où vous créez plus à terme représentant les valeurs calculées:

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

Peut-être que c'est plus de la réponse OP est aidé avec ... Indice: std :: transformer les futures en calculate_futures pour mieux exprimer l'intention. – xtofl