Procedura: Usare la classe transformer in una pipeline di dati
Questo argomento contiene un esempio di base che illustra come usare la classe concurrency::transformer in una pipeline di dati. Per un esempio più completo che usa una pipeline di dati per eseguire l'elaborazione delle immagini, vedere Procedura dettagliata: Creazione di una rete di elaborazione immagini.
La pipelining dei dati è un modello comune nella programmazione simultanea. Una pipeline di dati è costituita da una serie di fasi, in cui ogni fase esegue il lavoro e quindi passa il risultato del lavoro alla fase successiva. La transformer
classe un componente chiave nelle pipeline di dati perché riceve un valore di input, esegue operazioni su tale valore e quindi produce un risultato per l'uso di un altro componente.
Esempio
In questo esempio viene usata la pipeline di dati seguente per eseguire una serie di trasformazioni in base a un valore di input iniziale:
La prima fase calcola il valore assoluto del relativo input.
La seconda fase calcola la radice quadrata dell'input.
La terza fase calcola il quadrato del relativo input.
La fase in avanti nega l'input.
La quinta fase scrive il risultato finale in un buffer di messaggi.
Infine, l'esempio stampa il risultato della pipeline nella 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;
}
Nell'esempio viene prodotto l'output seguente:
The result is -42.
È comune che una fase in una pipeline di dati restituisca un valore il cui tipo differisce dal 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 (un double
) come output.
Nota
La pipeline di dati in questo esempio è illustrata. Poiché ogni operazione di trasformazione esegue poco lavoro, il sovraccarico necessario per eseguire il passaggio dei messaggi può superare i vantaggi derivanti dall'uso di una pipeline di dati.
Compilazione del codice
Copiare il codice di esempio e incollarlo in un progetto di Visual Studio oppure incollarlo in un file denominato data-pipeline.cpp
e quindi eseguire il comando seguente in una finestra del prompt dei comandi di Visual Studio.
cl.exe /EHsc data-pipeline.cpp
Vedi anche
Libreria di agenti asincroni
Blocchi dei messaggi asincroni
Procedura dettagliata: creazione di una rete per l'elaborazione di immagini