Laden...

Parallel For-Schleife liefert bei fixer Anzahl Durchläufe unterschiedliche Ergebnisse

Erstellt von Coooder vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.099 Views
C
Coooder Themenstarter:in
180 Beiträge seit 2011
vor 8 Jahren
Parallel For-Schleife liefert bei fixer Anzahl Durchläufe unterschiedliche Ergebnisse

Hallo,

ich hab ne kleine verständis frage zu den Parallel schleifen.

folgenes Test Konstrukt:


int test = 0;
Parallel.For(0, 20000, i =>
{
    test++;
});

Console.WriteLine(test);

Ich hätte erwarten das test am ende 20000 ist. Jedoch ist das immer unterschiedlich was da rauskommt.

Das die Parallel-Schleifenrümpfe quasi durcheinander ausgeführt werden ist mir bekannt. Allerdings läuft sie ja dennoch 20000 mal durch test sollte doch dann auch 20000 sein oder nich?

F
10.010 Beiträge seit 2004
vor 8 Jahren

In multithreaded Umgebungen muss man den Zugriff auf gemeinsam benutzte Resourcen immer synchronisieren.

In deinem Fall muss ja der Wert von test gelesen, dann incrementiert und dann geschrieben werden.
Wenn das nicht synchronisiert ist, passiert eben manchmal ein threadwechse nach dem lesen, und dann wird eben ggf von 2 oder mehr tasks der gleiche ausgangswert benutzt.

Die ganzen vereinfachungen der TPL bedeuten nicht, das man die Grundlagen vernachlässigen kann.

16.842 Beiträge seit 2008
vor 8 Jahren

Hinter

test++

steckt

test = test + 1

und ist der klassische und dabei einfachste Fall einer Race-Condition.
Anhand des ausführlichen Codes sieht man auch deutlicher, dass der Zugriff hier nicht synchronisiert ist.

Hierfür muss man zB Interlocked.Increment verwenden.

C
Coooder Themenstarter:in
180 Beiträge seit 2011
vor 8 Jahren

Wenn das nicht synchronisiert ist, passiert eben manchmal ein threadwechse nach dem lesen, und dann wird eben ggf von 2 oder mehr tasks der gleiche ausgangswert benutzt.

Ah ok, ja in die richtung ging auch mein Gedanke.

Ok ich danke euch beiden, wieder was dazu gelernt 😃