Partager via


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

Cet exemple indique comment utiliser l'annulation pour implémenter un algorithme 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 un objet Concurrency::structured_task_group pour rechercher la position qui contient la valeur donnée. Lorsqu'une fonction de travail trouve la valeur, elle appelle la méthode Concurrency::structured_task_group::cancel pour annuler tout futur travail. Le runtime annule toutes les tâches actives et n'en démarre pas de nouvelles.

// 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;

   // Use parallel_for to search for the element. 
   // The task group enables a work function to cancel the overall 
   // operation when it finds the result.

   structured_task_group tasks;
   tasks.run_and_wait([&]
   {
      parallel_for(std::size_t(0), count, [&](int n) {
         if (a[n] == what)
         {
            // Set the return value and cancel the remaining tasks. 
            position = n;            
            tasks.cancel();
         }
      });
   });

   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;
   }  
}

Voici un exemple de sortie pour cet exemple.

3123 is at position 4739.

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 2010.

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

Voir aussi

Référence

parallel_for, fonction

structured_task_group, classe

Concepts

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

Algorithmes parallèles