Share via


FAQ 1 : Pour boucler sur des entiers en parallèle, utiliser la méthode Parallel.For

clip_image002[4]

   Cette première FAQ est sans doute une tarte à la crème dans le cadre des extensions parallèles, mais elle semble parfaite, commencer cette nouvelle série.

for (int i = 0; i < 10; i++)
{
Task.Factory.StartNew(() => Console.WriteLine(i));
}

Ce petit fragment illustre un problème courant, car si vous compilez et exécutez ce code, vous obtiendrez un résultat similaire:

clip_image004[4]

   Alors pourquoi ce résultat ? La variable i est capturée par la fermeture sous la forme d’une seule instance, entrainant un bug à l’exécution. Pour corriger ce code, il nous suffit d’ajouter une variable intermédiaire, comme le montre l’exemple ci-dessous :

 for (int i = 0; i < 10; i++)
{
   int idx = i;
   Task.Factory.StartNew(() => Console.WriteLine(idx));
}

Cette variable intermédiaire est engendrée à chaque itération de la boucle. Si vous compiler et exécuter cette nouvelle version, vous obtiendrez un résultat similaire :

clip_image006[4]

   Ce petit souci peut arriver facilement si nous ne sommes pas vigilants. La bonne pratique est utiliser la méthode statique Parallel.For dans ce cas. Enfin, on note que les chiffres apparaissent de manière désordonnées ce qui complétement normale avec un traitement parallèle.

A bientôt

Bruno

boucard.bruno@free.fr