方法: データ パイプラインでトランスフォーマーを使用する

このトピックでは、データ パイプラインで Concurrency::transformer クラスを使用する方法の基本的な例について説明します。 データ パイプラインを使用してイメージ処理を実行する方法をより詳しく示した例については、「チュートリアル: イメージ処理ネットワークの作成」を参照してください。

データのパイプライン処理は、同時実行プログラミングにおける一般的なパターンです。 データ パイプラインは一連のステージで構成され、各ステージで処理を実行し、その処理の結果を次のステージに渡します。 transformer クラスは、入力値を受け取り、その値に対して処理を実行し、別のコンポーネントで使用する結果を生成するため、データ パイプラインにおいて重要なコンポーネントとなっています。

使用例

この例では、次のデータ パイプラインを使用して、渡される初期入力値に対して一連の変換を実行します。

  1. 最初のステージは、入力の絶対値を計算します。

  2. 2 番目のステージは、入力の平方根を計算します。

  3. 3 番目のステージは、入力の 2 乗を計算します。

  4. 4 番目のステージは、入力の符号を反転します。

  5. 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

参照

概念

非同期エージェント ライブラリ

非同期メッセージ ブロック

その他の技術情報

チュートリアル: イメージ処理ネットワークの作成