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?
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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 😃