Partager via


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

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

Exemple

L'exemple suivant utilise l'annulation pour rechercher un élément dans un tableau. La fonction parallel_find_any utilise l'algorithme concurrency::parallel_for et la fonction concurrency::run_with_cancellation_token pour rechercher la position qui contient la valeur donnée. Lorsque la boucle parallèle recherche la valeur, elle appelle la méthode concurrency::cancellation_token_source::cancel pour annuler les travaux à venir.

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

L'algorithme concurrency::parallel_for agit de manière simultanée. 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 et collez-le dans un projet Visual Studio, ou collez-le dans un fichier nommé parallel-array-search.cpp puis exécutez la commande suivante dans une fenêtre d'invite de commandes 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