Partager via


Comment : utiliser l'annulation pour rompre une boucle parallèle

Cet exemple montre comment utiliser l'annulation pour implémenter un algorithme de recherche parallèle simple.

Exemple

L'exemple suivant utilise l'annulation pour rechercher un élément dans un tableau.Le parallel_find_any fonction utilise le concurrency::parallel_for algorithme et la concurrency::run_with_cancellation_token fonction pour rechercher la position qui contient la valeur donnée.Lorsque la boucle parallèle détecte que la valeur, il appelle la concurrency::cancellation_token_source::cancel méthode pour annuler les travaux ultérieurs.

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

Le concurrency::parallel_for algorithme agit simultanément.Par conséquent, il n'effectue pas les opérations dans un ordre prédéterminé.Si le tableau contient plusieurs instances de la valeur, le résultat peut être n'importe laquelle de ses positions.

Compilation du code

Copiez l'exemple de code, collez-le dans un projet Visual Studio et collez-le dans un fichier nommé parallèle-tableau-search.cpp , puis exécutez la commande suivante dans une fenêtre d'invite de commande Visual Studio.

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

Voir aussi

Référence

parallel_for, fonction

cancellation_token_source, classe

Concepts

Annulation dans la bibliothèque de modèles parallèles

Algorithmes parallèles