方法: データ パイプラインでトランスフォーマーを使用する
このトピックでは、データ パイプラインで Concurrency::transformer クラスを使用する方法の基本的な例について説明します。 データ パイプラインを使用してイメージ処理を実行する方法をより詳しく示した例については、「チュートリアル: イメージ処理ネットワークの作成」を参照してください。
データのパイプライン処理は、同時実行プログラミングにおける一般的なパターンです。 データ パイプラインは一連のステージで構成され、各ステージで処理を実行し、その処理の結果を次のステージに渡します。 transformer クラスは、入力値を受け取り、その値に対して処理を実行し、別のコンポーネントで使用する結果を生成するため、データ パイプラインにおいて重要なコンポーネントとなっています。
使用例
この例では、次のデータ パイプラインを使用して、渡される初期入力値に対して一連の変換を実行します。
最初のステージは、入力の絶対値を計算します。
2 番目のステージは、入力の平方根を計算します。
3 番目のステージは、入力の 2 乗を計算します。
4 番目のステージは、入力の符号を反転します。
5 番目のステージは、最終的な結果をメッセージ バッファーに書き込みます。
最後に、この例はパイプラインの結果をコンソールに出力します。
// 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.
一般に、データ パイプラインのステージは、入力値と異なる種類の値を出力します。 この例では、2 番目のステージは入力として int 型の値を取得し、出力としてその値の平方根 (double 型) を生成します。
注意
この例のデータ パイプラインは、例示のみを目的としています。 各変換操作での処理量が少ないため、メッセージ パッシングを実行するのに必要なオーバーヘッドがデータ パイプラインを使用するメリットを上回る場合があります。
コードのコンパイル
プログラム例をコピーし、Visual Studio プロジェクトに貼り付けるか、data-pipeline.cpp という名前のファイルに貼り付け、Visual Studio 2010 のコマンド プロンプト ウィンドウで次のコマンドを実行します。
cl.exe /EHsc data-pipeline.cpp