Aracılığıyla paylaş


Nasıl yapılır: iptali için sonu paralel bir döngü kullanın.

Bu örnek, iptali temel paralel arama algoritması uygulamak için nasıl kullanılacağını gösterir.

Örnek

Aşağıdaki örnek, bir dizi öğe aramak için İptali kullanır. parallel_find_any İşlevini kullanan concurrency::parallel_for algoritması ve concurrency::run_with_cancellation_token verilen değer içeren konumu arama işlevi. Paralel döngü değerini bulduğunda, çağrı concurrency::cancellation_token_source::cancel gelecekteki iş iptal etme yöntemi.

// 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::parallel_for algoritması eşzamanlı olarak davranır. Bu nedenle, bu işlemleri hazırlaması sırayla gerçekleştirmez. Dizi değeri birden çok örneği varsa, sonuç kendi pozisyonları herhangi biri olabilir.

Kod Derleniyor

Örnek kodu kopyalayın ve Visual Studio Project'te yapıştırın veya adlı bir dosyaya yapıştırın paralel dizi search.cpp ve Visual Studio komut istemi penceresinde aşağıdaki komutu çalıştırın.

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

Ayrıca bkz.

Başvuru

parallel_for işlevi

cancellation_token_source sınıfı

Kavramlar

ppl iptali

Paralel algoritmalar