Cara: Menggunakan transformator dalam Alur Data

Topik ini berisi contoh dasar yang menunjukkan cara menggunakan kelas konkurensi::transformer dalam alur data. Untuk contoh yang lebih lengkap yang menggunakan alur data untuk melakukan pemrosesan gambar, lihat Panduan: Membuat Jaringan Pemrosesan Gambar.

Alur data adalah pola umum dalam pemrograman bersamaan. Alur data terdiri dari serangkaian tahapan, di mana setiap tahap melakukan pekerjaan dan kemudian meneruskan hasil pekerjaan tersebut ke tahap berikutnya. Kelas transformer komponen kunci dalam alur data karena menerima nilai input, melakukan pekerjaan pada nilai tersebut, lalu menghasilkan hasil untuk digunakan komponen lain.

Contoh

Contoh ini menggunakan alur data berikut untuk melakukan serangkaian transformasi yang diberi nilai input awal:

  1. Tahap pertama menghitung nilai absolut inputnya.

  2. Tahap kedua menghitung akar kuadrat inputnya.

  3. Tahap ketiga menghitung kuadrat inputnya.

  4. Tahap ke depan meniadakan inputnya.

  5. Tahap kelima menulis hasil akhir ke buffer pesan.

Terakhir, contoh mencetak hasil alur ke konsol.

// 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;
}

Contoh ini menghasilkan output berikut:

The result is -42.

Adalah umum untuk tahap dalam alur data untuk menghasilkan nilai yang jenisnya berbeda dari nilai inputnya. Dalam contoh ini, tahap kedua mengambil nilai jenis int sebagai inputnya dan menghasilkan akar kuadrat dari nilai tersebut (a double) sebagai outputnya.

Catatan

Alur data dalam contoh ini adalah untuk ilustrasi. Karena setiap operasi transformasi melakukan sedikit pekerjaan, overhead yang diperlukan untuk melakukan pengiriman pesan dapat melebihi manfaat menggunakan alur data.

Mengompilasi Kode

Salin kode contoh dan tempelkan dalam proyek Visual Studio, atau tempelkan dalam file yang diberi nama data-pipeline.cpp lalu jalankan perintah berikut di jendela Prompt Perintah Visual Studio.

cl.exe /EHsc data-pipeline.cpp

Baca juga

Pustaka Agen Asinkron
Blok Pesan Asinkron
Panduan: Membuat Jaringan Pemrosesan Gambar