如何:在数据管道中使用转换器

本主题包含一个基本示例,该示例演示如何在数据管道中使用 concurrency::transformer 类。 有关使用数据管道执行图像处理的更完整示例,请参阅演练:创建图像处理网络

数据管道是并发编程中的一种常见模式。 数据管道由一系列阶段组成,每个阶段执行工作,然后将该工作的结果传递到下一个阶段。 transformer 类是数据管道中的关键组件,因为它接收输入值,对该值执行工作,然后生成结果供另一个组件使用。

示例

此示例使用以下数据管道在给定初始输入值的情况下执行一系列转换:

  1. 第一阶段计算其输入的绝对值。

  2. 第二阶段计算其输入的平方根。

  3. 第三阶段计算其输入的平方。

  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.

数据管道中的阶段通常会输出类型与其输入值不同的值。 在此示例中,第二阶段将 int 类型的值作为其输入,并生成该值的平方根 (a double) 作为其输出。

注意

此示例中的数据管道用于说明。 由于每个转换操作执行的工作很少,因此执行消息传递所需的开销可能超过使用数据管道的好处。

编译代码

复制示例代码,并将它粘贴到 Visual Studio 项目中,或粘贴到名为 data-pipeline.cpp 的文件中,再在 Visual Studio 命令提示符窗口中运行以下命令。

cl.exe /EHsc data-pipeline.cpp

另请参阅

异步代理库
异步消息块
演练:创建图像处理网络