方法: データ パイプラインでトランスフォーマーを使用する
このトピックには使用する方法を示す基本的な例が含まれています、 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 プロジェクトでは、貼り付けるまたはという名前のファイルに貼り付けてデータ pipeline.cpp と、Visual Studio のコマンド プロンプト ウィンドウで次のコマンドを実行します。
cl.exe /EHsc data-pipeline.cpp