Nasıl yapılır: Paralel Bir Döngüden Kurtulmak için İptal

Bu örnekte, temel bir paralel arama algoritması uygulamak için iptalin nasıl kullanılacağı gösterilmektedir.

Örnek

Aşağıdaki örnek, dizideki bir öğeyi aramak için iptali kullanır. İşlev, parallel_find_any verilen değeri içeren konumu aramak için concurrency::p arallel_for algoritmasını ve concurrency::run_with_cancellation_token işlevini kullanır. Paralel döngü değeri bulduğunda, gelecekteki çalışmayı iptal etmek için eşzamanlılık::cancellation_token_source::cancel yöntemini çağırır.

// 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.
*/

concurrency ::p arallel_for algoritması eşzamanlı olarak çalışır. Bu nedenle, işlemleri önceden belirlenmiş bir sırada gerçekleştirmez. Dizi değerin birden çok örneğini içeriyorsa, sonuç konumlarından herhangi biri olabilir.

Kod Derleniyor

Örnek kodu kopyalayıp bir Visual Studio projesine yapıştırın veya adlı parallel-array-search.cpp bir dosyaya yapıştırın ve ardından bir Visual Studio Komut İstemi penceresinde aşağıdaki komutu çalıştırın.

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

Ayrıca bkz.

PPL'de İptal
Paralel Algoritmalar
parallel_for İşlevi
cancellation_token_source Sınıfı