Como usar transformador em um pipeline de dados
Este tópico contém um exemplo básico que mostra como usar a classe concurrency::transformer em um pipeline de dados. Para obter um exemplo completo que usa um pipeline de dados para executar o processamento de imagens em paralelo, veja Passo a passo: criar uma rede de processamento de imagens.
O pipeline de dados é um padrão comum na programação simultânea. Um pipeline de dados consiste em uma série de estágios, em que cada estágio executa o trabalho e, em seguida, passa o resultado desse trabalho para o próximo estágio. A classe transformer
é um componente-chave em pipelines de dados porque recebe um valor de entrada, executa o trabalho nesse valor e, em seguida, produz um resultado para uso por outro componente.
Exemplo
Este exemplo usa o pipeline de dados a seguir para executar uma série de transformações, considerando um valor de entrada inicial:
O primeiro estágio calcula o valor absoluto de sua entrada.
O segundo estágio calcula a raiz quadrada de sua entrada.
O terceiro estágio calcula o quadrado de sua entrada.
O estágio seguinte nega sua entrada.
O quinto estágio grava o resultado final em um buffer de mensagens.
Por fim, o exemplo imprime o resultado do pipeline no 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;
}
Esse exemplo gera a saída a seguir:
The result is -42.
É comum que um estágio em um pipeline de dados gere um valor cujo tipo difere do valor de entrada. Neste exemplo, o segundo estágio usa um valor de tipo int
como entrada e produz a raiz quadrada desse valor (um double
) como saída.
Observação
O pipeline de dados neste exemplo é para ilustração. Como cada operação de transformação executa pouco trabalho, a sobrecarga necessária para executar a passagem de mensagens pode superar os benefícios do uso de um pipeline de dados.
Compilando o código
Copie o código de exemplo e cole-o em um projeto do Visual Studio, ou cole-o em um arquivo chamado data-pipeline.cpp
e execute o comando a seguir em uma janela do Prompt de comando do Visual Studio.
cl.exe /EHsc data-pipeline.cpp
Confira também
Biblioteca de agentes assíncronos
Blocos de mensagens assíncronos
Instruções passo a passo: criando uma rede de processamento de imagem