Dela via


Anvisningar: Använda transformator i en datapipeline

Det här avsnittet innehåller ett grundläggande exempel som visar hur du använder concurrency::transformer-klassen i en datapipeline. Ett mer komplett exempel som använder en datapipeline för att utföra bildbearbetning finns i Genomgång: Skapa ett Image-Processing nätverk.

Datapipelining är ett vanligt mönster i samtidig programmering. En datapipeline består av en serie steg, där varje steg utför arbete och sedan skickar resultatet av det arbetet till nästa steg. Klassen transformer en nyckelkomponent i datapipelines eftersom den tar emot ett indatavärde, utför arbete med det värdet och sedan ger ett resultat för en annan komponent att använda.

Exempel

I det här exemplet används följande datapipeline för att utföra en serie transformeringar med ett initialt indatavärde:

  1. Den första fasen beräknar det absoluta värdet för dess indata.

  2. Den andra fasen beräknar kvadratroten för dess indata.

  3. Den tredje fasen beräknar kvadraten av sina indata.

  4. Den fjärde fasen negerar sina indata.

  5. Det femte steget skriver slutresultatet till en meddelandebuffert.

Slutligen skriver exemplet ut resultatet av pipelinen till konsolen.

// 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;
}

Det här exemplet genererar följande utdata:

The result is -42.

Det är vanligt att en fas i en datapipeline matar ut ett värde vars typ skiljer sig från indatavärdet. I det här exemplet tar den andra fasen ett värde av typen int som indata och skapar kvadratroten för det värdet (a double) som utdata.

Anmärkning

Datapipelinen i det här exemplet är en illustration. Eftersom varje transformeringsåtgärd utför lite arbete kan de omkostnader som krävs för att utföra meddelandeöverföring uppväga fördelarna med att använda en datapipeline.

Kompilera koden

Kopiera exempelkoden och klistra in den i ett Visual Studio-projekt, eller klistra in den i en fil med namnet data-pipeline.cpp och kör sedan följande kommando i ett Visual Studio-kommandotolkfönster.

cl.exe /EHsc data-pipeline.cpp

Se även

Asynkront agentbibliotek
Asynkrona meddelandeblock
Genomgång: Skapa ett Image-Processing nätverk