Comment : utiliser la classe transformer dans un pipeline de données

Cette rubrique contient un exemple de base qui montre comment utiliser la classe concurrency ::transformer dans un pipeline de données. Pour obtenir un exemple plus complet qui utilise un pipeline de données pour effectuer le traitement d’images, consultez Procédure pas à pas : Création d’un réseau de traitement d’images.

Le pipelining de données est un modèle courant dans la programmation simultanée. Un pipeline de données se compose d’une série d’étapes, où chaque étape effectue le travail, puis passe le résultat de ce travail à l’étape suivante. Classe transformer un composant clé dans les pipelines de données, car il reçoit une valeur d’entrée, effectue un travail sur cette valeur, puis produit un résultat pour un autre composant à utiliser.

Exemple

Cet exemple utilise le pipeline de données suivant pour effectuer une série de transformations en fonction d’une valeur d’entrée initiale :

  1. La première étape calcule la valeur absolue de son entrée.

  2. La deuxième étape calcule la racine carrée de son entrée.

  3. La troisième étape calcule le carré de son entrée.

  4. La deuxième étape annule son entrée.

  5. La cinquième étape écrit le résultat final dans une mémoire tampon de message.

Enfin, l’exemple imprime le résultat du pipeline dans la console.

// data-pipeline.cpp
// compile with: /EHsc
#include <agents.h>
#include <math.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Computes the absolute value of its input.
   transformer<int, int> t0([](int n) {
      return abs(n);
   });

   // Computes the square root of its input.
   transformer<int, double> t1([](int n) {
      return sqrt(static_cast<double>(n));
   });

   // Computes the square its input.
   transformer<double, int> t2([](double n) {
      return static_cast<int>(n * n);
   });

   // Negates its input.
   transformer<int, int> t3([](int n) {
      return -n;
   });

   // Holds the result of the pipeline computation.
   single_assignment<int> result;

   // Link together each stage of the pipeline.
   // t0 -> t1 -> t2 -> t3 -> result
   t0.link_target(&t1);
   t1.link_target(&t2);
   t2.link_target(&t3);
   t3.link_target(&result);

   // Propagate a message through the pipeline.
   send(t0, -42);

   // Print the result to the console.
   wcout << L"The result is " << receive(result) << L'.' << endl;
}

Cet exemple produit la sortie suivante :

The result is -42.

Il est courant pour une étape d’un pipeline de données de générer une valeur dont le type diffère de sa valeur d’entrée. Dans cet exemple, la deuxième étape prend une valeur de type int comme entrée et produit la racine carrée de cette valeur (a double) comme sortie.

Remarque

Le pipeline de données de cet exemple est illustré. Étant donné que chaque opération de transformation effectue peu de travail, la surcharge requise pour effectuer la transmission de messages peut dépasser les avantages de l’utilisation d’un pipeline de données.

Compilation du code

Copiez l’exemple de code et collez-le dans un projet Visual Studio, ou collez-le dans un fichier nommé data-pipeline.cpp , puis exécutez la commande suivante dans une fenêtre d’invite de commandes Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Voir aussi

Bibliothèque d’agents asynchrones
Blocs de messages asynchrones
Procédure pas à pas : création d’un réseau de traitement d’image