Procedura: utilizzare l'annullamento per interrompere un ciclo Parallel

In questo esempio viene illustrato come utilizzare l'annullamento per implementare un algoritmo di base ricerca parallela.

Esempio

Nell'esempio seguente viene utilizzato l'annullamento per cercare un elemento in una matrice.Il parallel_find_any funzione utilizza il concurrency::parallel_for algoritmo e la concurrency::run_with_cancellation_token funzione per cercare la posizione che contiene il valore specificato.Quando il ciclo parallelo rileva che il valore, viene chiamato il concurrency::cancellation_token_source::cancel metodo per annullare il lavoro futuro.

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

Il concurrency::parallel_for algoritmo agisce contemporaneamente.Pertanto, non esegue le operazioni in un ordine predeterminato.Se la matrice contiene più istanze del valore, il risultato può essere una delle relative posizioni.

Compilazione del codice

Copiare il codice di esempio e incollarlo in un progetto di Visual Studio o incollarlo in un file denominato parallelo-array-search.cpp e quindi eseguire il comando riportato di seguito in una finestra del prompt dei comandi di Visual Studio.

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

Vedere anche

Riferimenti

Funzione parallel_for

Classe cancellation_token_source

Concetti

Annullamento nella libreria PPL

Algoritmi paralleli