방법: 데이터 파이프라인에서 transformer 사용
이 항목에는 데이터 파이프라인에서 동시성::변환기 클래스를 사용하는 방법을 보여 주는 기본 예제가 포함되어 있습니다. 데이터 파이프라인을 사용하여 이미지 처리를 수행하는 보다 완전한 예제는 연습: 이미지 처리 네트워크 만들기를 참조하세요.
데이터 파이프라인은 동시 프로그래밍에서 일반적인 패턴입니다. 데이터 파이프라인은 각 단계가 작업을 수행한 다음 해당 작업의 결과를 다음 단계로 전달하는 일련의 단계로 구성됩니다. 입력 값을 받고, 해당 transformer
값에 대한 작업을 수행한 다음, 사용할 다른 구성 요소에 대한 결과를 생성하기 때문에 데이터 파이프라인의 핵심 구성 요소 클래스입니다.
예시
이 예제에서는 다음 데이터 파이프라인을 사용하여 초기 입력 값이 지정된 일련의 변환을 수행합니다.
첫 번째 단계에서는 입력의 절대값을 계산합니다.
두 번째 단계에서는 입력의 제곱근을 계산합니다.
세 번째 단계에서는 해당 입력의 제곱을 계산합니다.
앞의 단계는 입력을 부정합니다.
다섯 번째 단계에서는 최종 결과를 메시지 버퍼에 씁니다.
마지막으로, 이 예제에서는 파이프라인의 결과를 콘솔에 출력합니다.
// 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;
}
이 예제는 다음과 같은 출력을 생성합니다.
The result is -42.
데이터 파이프라인의 단계에서는 입력 값과 형식이 다른 값을 출력하는 것이 일반적입니다. 이 예제에서 두 번째 단계에서는 형식 int
값을 입력으로 사용하고 해당 값(a)의 제곱근을 double
출력으로 생성합니다.
참고 항목
이 예제의 데이터 파이프라인은 설명용입니다. 각 변환 작업은 거의 작업을 수행하지 않으므로 메시지 전달을 수행하는 데 필요한 오버헤드가 데이터 파이프라인 사용의 이점보다 클 수 있습니다.
코드 컴파일
예제 코드를 복사하여 Visual Studio 프로젝트에 붙여넣거나 이름이 지정된 data-pipeline.cpp
파일에 붙여넣은 다음 Visual Studio 명령 프롬프트 창에서 다음 명령을 실행합니다.
cl.exe /EHsc data-pipeline.cpp