Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit onderwerp bevat een basisvoorbeeld dat laat zien hoe u de gelijktijdigheidsklasse::transformer gebruikt in een gegevenspijplijn. Zie Walkthrough: Een Image-Processing Network maken voor een volledig voorbeeld waarin een gegevenspijplijn wordt gebruikt om afbeeldingsverwerking uit te voeren.
Gegevenspijplijnen zijn een gemeenschappelijk patroon in gelijktijdig programmeren. Een gegevenspijplijn bestaat uit een reeks fasen, waarbij elke fase werk uitvoert en vervolgens het resultaat van dat werk doorgeeft aan de volgende fase. De transformer klasse een sleutelonderdeel in gegevenspijplijnen omdat het een invoerwaarde ontvangt, die waarde uitvoert en vervolgens een resultaat produceert voor een ander onderdeel dat moet worden gebruikt.
Voorbeeld
In dit voorbeeld wordt de volgende gegevenspijplijn gebruikt om een reeks transformaties uit te voeren op basis van een initiƫle invoerwaarde:
In de eerste fase wordt de absolute waarde van de invoer berekend.
De tweede fase berekent de vierkantswortel van de invoer.
De derde fase berekent het kwadraat van de invoer.
De vierde fase maakt de invoer ongedaan.
In de vijfde fase wordt het uiteindelijke resultaat naar een berichtbuffer geschreven.
Ten slotte wordt in het voorbeeld het resultaat van de pijplijn naar de console afgedrukt.
// 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;
}
In dit voorbeeld wordt de volgende uitvoer gegenereerd:
The result is -42.
Het is gebruikelijk dat een fase in een gegevenspijplijn een waarde uitvoert waarvan het type verschilt van de invoerwaarde. In dit voorbeeld neemt de tweede fase een waarde van het type int als invoer en produceert de vierkantswortel van die waarde (a double) als uitvoer.
Opmerking
De gegevenspijplijn in dit voorbeeld is ter illustratie. Omdat elke transformatiebewerking weinig werk uitvoert, kan de overhead die nodig is om berichten door te geven, opwegen tegen de voordelen van het gebruik van een gegevenspijplijn.
De code compileren
Kopieer de voorbeeldcode en plak deze in een Visual Studio-project, of plak deze in een bestand met de naam data-pipeline.cpp en voer vervolgens de volgende opdracht uit in een Visual Studio-opdrachtpromptvenster.
cl.exe /EHsc-data-pipeline.cpp
Zie ook
Bibliotheek met asynchrone agents
Asynchrone berichtblokken
Overzicht: Een Image-Processing-netwerk maken