Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Parallel For-Schleife liefert bei fixer Anzahl Durchläufe unterschiedliche Ergebnisse
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

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

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10074

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15806
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

beantworten | zitieren | melden

Zitat von FZelle
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 :)
private Nachricht | Beiträge des Benutzers