Cara: Menggunakan Pembatalan untuk Memutuskan dari Perulangan Paralel

Contoh ini menunjukkan cara menggunakan pembatalan untuk menerapkan algoritma pencarian paralel dasar.

Contoh

Contoh berikut menggunakan pembatalan untuk mencari elemen dalam array. Fungsi ini parallel_find_any menggunakan fungsi konkurensi::p arallel_for algoritma dan fungsi konkurensi::run_with_cancellation_token untuk mencari posisi yang berisi nilai yang diberikan. Ketika perulangan paralel menemukan nilai, ia memanggil metode konkurensi::cancellation_token_source::cancel untuk membatalkan pekerjaan di masa mendatang.

// parallel-array-search.cpp
// compile with: /EHsc
#include <ppl.h>
#include <iostream>
#include <random>

using namespace concurrency;
using namespace std;

// Returns the position in the provided array that contains the given value, 
// or -1 if the value is not in the array.
template<typename T>
int parallel_find_any(const T a[], size_t count, const T& what)
{
   // The position of the element in the array. 
   // The default value, -1, indicates that the element is not in the array.
   int position = -1;

   // Call parallel_for in the context of a cancellation token to search for the element.
   cancellation_token_source cts;
   run_with_cancellation_token([count, what, &a, &position, &cts]()
   {
      parallel_for(std::size_t(0), count, [what, &a, &position, &cts](int n) {
         if (a[n] == what)
         {
            // Set the return value and cancel the remaining tasks.
            position = n;
            cts.cancel();
         }
      });
   }, cts.get_token());

   return position;
}

int wmain()
{
   const size_t count = 10000;
   int values[count];
 
   // Fill the array with random values.
   mt19937 gen(34);
   for (size_t i = 0; i < count; ++i)
   {
      values[i] = gen()%10000;
   }
 
   // Search for any position in the array that contains value 3123.
   const int what = 3123;
   int position = parallel_find_any(values, count, what);
   if (position >= 0)
   {
      wcout << what << L" is at position " << position << L'.' << endl;
   }
   else
   {
      wcout << what << L" is not in the array." << endl;
   }
}
/* Sample output:
    3123 is at position 7835.
*/

Konkurensi ::p arallel_for algoritma bertindak bersamaan. Oleh karena itu, ia tidak melakukan operasi dalam urutan yang telah ditentukan sebelumnya. Jika array berisi beberapa instans nilai, hasilnya bisa menjadi salah satu posisinya.

Mengompilasi Kode

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

cl.exe /EHsc parallel-array-search.cpp

Baca juga

Pembatalan di PPL
Algoritma Paralel
Fungsi parallel_for
Kelas cancellation_token_source