Partilhar via


Como usar o 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 mais completo que usa um pipeline de dados para executar o processamento de imagens, consulte Passo a passo: Criando uma rede Image-Processing.

O pipelining de dados é um padrão comum na programação simultânea. Um pipeline de dados consiste em uma série de estágios, onde cada estágio executa o trabalho e, em seguida, passa o resultado desse trabalho para o próximo estágio. A transformer classe é um componente chave em pipelines de dados porque recebe um valor de entrada, executa trabalho nesse valor e, em seguida, produz um resultado para ser usado por outro componente.

Exemplo

Este exemplo usa o seguinte pipeline de dados para executar uma série de transformações com um valor de entrada inicial:

  1. A primeira etapa calcula o valor absoluto de sua entrada.

  2. O segundo estágio calcula a raiz quadrada de sua entrada.

  3. O terceiro estágio calcula o quadrado de sua entrada.

  4. A quarta etapa nega a sua contribuição.

  5. O quinto estágio grava o resultado final em um buffer de mensagens.

Finalmente, 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;
}

Este exemplo produz a seguinte saída:

The result is -42.

É comum que um estágio em um pipeline de dados produza um valor cujo tipo difere de seu valor de entrada. Neste exemplo, o segundo estágio toma um valor de tipo int como sua entrada e produz a raiz quadrada desse valor (a double) como sua saída.

Observação

O fluxo de dados neste exemplo é apenas ilustrativo. 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, em seguida, execute o seguinte comando em uma janela do prompt de comando do Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Ver também

Biblioteca de agentes assíncronos
Blocos de mensagens assíncronas
Passo a passo: Criando uma rede Image-Processing