En parallèle.Pour(): mise à Jour de la variable en dehors de la boucle

Je suis juste à la recherche de la nouvelle .NET 4.0 caractéristiques. Cela dit, je vais tenter de faire un simple calcul à l'aide de Parallel.For et de normal for(x;x;x) boucle.

Cependant, j'obtiens des résultats différents à environ 50% du temps.

long sum = 0;

Parallel.For(1, 10000, y =>
    {
        sum += y;
    }
);

Console.WriteLine(sum.ToString());

sum = 0;

for (int y = 1; y < 10000; y++)
{
   sum += y;
}
Console.WriteLine(sum.ToString());

Ma conjecture est que les fils sont en train de mettre à jour "somme" en même temps.

Est-il une façon évidente autour d'elle?

  • La programmation simultanée est livré en deux parties, 1) l'exécution d'un thread séparé, et 2) la synchronisation\la communication entre les threads. parallel extensions permettent 1), cependant 2) doit être traitée explicitement par le développeur, et quand vous dites sum += y; vous sont effectivement avoir chaque thread dire "m'ajouter à la somme!", tout à la fois. vous avez besoin de synchroniser leur communication en ce qui concerne la ressource partagée sum
  • mes craintes se réalisent... parallel extensions de laisser les gens à écrire du code en parallèle sans la compréhension de la théorie, y compris les conditions de course (comme ici)
  • Oui, c'est pourquoi certains d'entre nous vraiment essayer de l'apprendre en premier (c'est à dire. en affichant des questions sur soi).
  • je vous recommande de lire quelques articles sur le multithreading et essayer de le programmer dans le niveau inférieur, à l'aide de threads. puis passer à extensions parallèles, parce que c'est juste un wrapper et il cache beaucoup de choses de vous.
  • Je ne sais pas pourquoi Msft introduit en parallèle des extensions de la première place... il va juste pour encourager les gens à parallèle des trucs qui ne devraient pas/n'a pas besoin d'être exécutées en parallèle.
  • Je ne pense pas que vous avez beaucoup à apprendre de faible niveau de programmation de threads, mais vous avez à comprendre les enjeux. Le TPL fait beaucoup pour aider à la création et à la gestion des threads par abstraction comme un type de Tâche. Il ne fait pas beaucoup pour aider avec des données partagées. Vous devez comprendre ces questions, même lors de l'utilisation de tâches.
  • Même avec LINQ, ne sais pas pourquoi MS introduit que ce soit. Nous avons de la boucle! /sarcasme
  • Je n'ai fait aucune référence à LINQ... Ce que je fais remarquer, c'est que les frais généraux de quelque chose comme ceci est beaucoup plus élevé que l'exécution de cette tout dans un seul thread. Les gens vont commencer à lancer en Parallèle.Pour n'importe quel endroit dans le code de leurs ils ont de grandes boucles... ce que je veux dire c'est que cela va encourager les gens à introduire inutilement le multithreading dans leurs programmes.
  • Parce qu'il y est un changement fondamental dans la plate-forme matérielle. Je vous suggère de regarder le Manycore Maj du papier blanc, et microsoft.com/downloads/... Herb Sutter la Fin de la Déjeuner gratuit, l'article gotw.ca/publications/concurrency-ddj.htm
  • droit, mais combien de fois allez-vous écrire une vraie boucle qui est suffisamment long pour justifier le multithreading?? Même avec plusieurs cœurs, le multithreading, qui fonctionne le mieux avec IO lié ou très fortement dépendant du PROCESSEUR des tâches... et sans surprise, la plupart de code n'est PAS très IO ou liées à l'UC. Mon point est que cela va encourager n00bies de jeter le multithreading à chaque problème.
  • juste pickin', et ce n'était qu'un exemple trivial. @AdeMiller: exactement pourquoi je pense que c'est important. Je pourrais sortir avec un couple simple threads dans une application au cours des années, mais maintenant, avec 6 processeurs à cœur, pourquoi ne pas créer plus rapide et évolutive des applications?
  • Nous nous dirigeons vers un monde où les ordinateurs ont des centaines de cœurs. Pour ce monde, il est logique de faire des programmes multithread. D'ailleurs, pourquoi détestez-vous sur une technologie qui rend la programmation de quelque chose de difficile beaucoup plus facile?
  • mon point n'était pas que cette fonctionnalité n'est pas TOUJOURS inutile, certes, il y aura donc des cas utiles pour cela. Je dis simplement que, dans la PLUPART des CAS, cette fonctionnalité est complètement inutile, et sera effectivement RALENTIR votre code vers le bas. Il n'a pas d'importance combien de flipper coeurs que vous avez, il va y avoir des coûts additionnels dans la fabrication de ces cœurs de communiquer avec d'autres personnes. Donc, il est idéal pour faire ces carottes de parler à d'autres personnes quand ils absolument.
  • parallel extensions ne prétends pas obtenir beaucoup plus facile.
  • sur les Gpu des centaines de cœurs sont la réalité d'aujourd'hui.
  • Je pense que le souci, c'est si les gens écrire du code sans le comprendre, et de se contenter de poser des questions quand le résultat est différent de ce à quoi ils s'attendaient. Le problème avec cette méthode est que vous pouvez écrire du code qui semble bien fonctionner quand vous le tester sur votre single core dev machine sur de petites quantités de données, mais échoue lamentablement lorsque vous déployez pour le multicœur serveur de production et de grands ensembles de données. Toutefois, +1 pour la question.

InformationsquelleAutor Inisheer | 2010-05-05