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 de base.

Exemple

L’exemple suivant utilise l’annulation pour rechercher un élément dans un tableau. La parallel_find_any fonction utilise l’algorithme concurrency ::p arallel_for et la fonction concurrency ::run_with_cancellation_token pour rechercher la position qui contient la valeur donnée. Lorsque la boucle parallèle trouve la valeur, elle appelle la méthode concurrency ::cancellation_token_source ::cancel pour annuler le travail ultérieur.

// 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’accès concurrentiel ::p arallel_for algorithm agit simultanément. Par conséquent, elle n’effectue pas les opérations dans un ordre prédéfinit. Si le tableau contient plusieurs instances de la valeur, le résultat peut être l’une 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

Annulation dans la bibliothèque de modèles parallèles
Algorithmes parallèles
fonction parallel_for
cancellation_token_source, classe