Condividi tramite


Procedura: Utilizzare la classe transformer in una pipeline di dati

In questo argomento contiene un esempio di base viene illustrato come utilizzare il concurrency::transformer classe in una pipeline di dati.Per un esempio più completo, in cui viene utilizzata una pipeline di dati per eseguire l'elaborazione di immagini, vedere Procedura dettagliata: creazione di una rete per l'elaborazione di immagini.

Il pipelining dei dati è un modello comune nella programmazione simultanea.Una pipeline di dati è costituita da una serie di fasi, in cui ogni fase esegue un lavoro e quindi passa il risultato del lavoro alla fase successiva.La classe transformer è un componente chiave nelle pipeline di dati poiché riceve un valore di input, eseguire un lavoro su tale valore, quindi produce un risultato che verrà utilizzato da un altro componente.

Esempio

In questo esempio viene utilizzata la pipeline di dati seguente per effettuare una serie di trasformazioni in base a un valore di input iniziale:

  1. Nella prima fase viene calcolato il valore assoluto dell'input.

  2. Nella seconda fase viene calcolata la radice quadrata dell'input.

  3. Nella terza fase viene calcolato il quadrato dell'input.

  4. Nella quarta fase viene negato l'input.

  5. Nella quinta fase viene scritto il risultato finale in un buffer dei messaggi.

Infine viene visualizzato il risultato della pipeline sulla 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;
}

Questo esempio produce il seguente output:

The result is -42.

In genere una fase di una pipeline di dati restituisce un valore il cui tipo è diverso dal relativo valore di input.In questo esempio la seconda fase accetta un valore di tipo int come input e produce la radice quadrata di tale valore (double) come output.

[!NOTA]

La pipeline di dati in questo esempio ha scopo illustrativo.Poiché ogni operazione di trasformazione esegue una quantità minima di lavoro, il sovraccarico necessario per eseguire il passaggio dei messaggi può annullare i vantaggi derivanti dall'utilizzo di una pipeline di dati.

Compilazione del codice

Copiare il codice di esempio e incollarlo in un progetto di Visual Studio o incollarlo in un file denominato dati pipeline.cpp e quindi eseguire il comando riportato di seguito in una finestra del prompt dei comandi di Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Vedere anche

Attività

Procedura dettagliata: creazione di una rete per l'elaborazione di immagini

Concetti

Libreria di agenti asincroni

Blocchi dei messaggi asincroni