Seite 1 von 1

[gelöst] [C#] Übernatürliche Erscheinungen durch Threading

Verfasst: 16.02.2017, 19:03
von ponx
Hallo Leute,
ich versuche gerade erfolglos, Teile meines Programms zu parallelisieren. Dabei sollen die einzelnen Threads jeweils ein eigenes HashSet von strings generieren, die dann am Ende nur noch in ein gemeinsames HashSet geworfen werden (innerhalb eines kritischen Abschnitts, da sollte nix schiefgehen). Ich kriege jetzt bei jedem Programmaufruf immer ein anderes Ergebnis, und zwar anscheinend immer nur Teilergebnisse einzelner Threads. Bei der Fehlersuche habe ich festgestellt, dass anscheinend die Parameter überhaupt nicht (mehr) stimmen, mit denen Threads arbeiten. Habt ihr sowas hier schonmal gesehen?

Bild

...sprich, beide Indizes (iRow und iCol) auf 3, obwohl ich ausdrücklich jeweils nur bis 2 zählen will..? Was läuft hier falsch, ich hab keine Ahnung. Der Debugger?

Das Thread.Sleep() am Ende soll sicherstellen, dass alle Threads genug Zeit zum Beenden haben, falls das join() am Ende aus irgendeinem Grund ignoriert werden sollte. Aber das ändert auch nichts an den falschen Ergebnissen.
Ohne das Threading hatte alles schön geklappt, also an der eigentlichen Logik liegt es nicht. (da wurde auch nicht bis 3 gezählt)
Vielleicht habt ihr eine Anregung? Bin ratlos! :/

EDIT: Klappt alles bestens jetzt, yeah!!!

Re: [C#] Übernatürliche Erscheinungen durch Threading

Verfasst: 16.02.2017, 20:49
von Zudomon
Leider kann ich dir dazu keinen Rat geben. Wollte nur loswerden, dass der Thread-Titel geil ist! :D
Hätte ja auch einfach geliked statt kommentiert, aber das geht ja nicht :lol:

Re: [C#] Übernatürliche Erscheinungen durch Threading

Verfasst: 16.02.2017, 21:38
von Krishty
1. Neun Threads werden erzeugt (0|0, 0|1, 0|2, 1|0, 1|1, … 2|2)
2. wenn die Schleifen durch sind, sind die letzten Werte, die iRow und iCol zugewiesen wurden, jeweils 3 (denn das ist die jeweilige Abbruchbedingung)
3. die Threads laufen aber immernoch (sind halt Threads, können daher halt auch später scheduled werden)
4. du hast bestimmt Referenzen an iRow und iCol an die Threads übergeben anstatt jedem Thread eine Kopie (das muss jemand kommentieren, der sich mit C# besser auskennt!), darum sehen die Threads nun auch 3|3

Inb4 „Das ist der Grund, warum ich keine virtuellen Funktionen Exceptions Templates Garbage Collectors Lambdas benutze: Man kann vom Blick auf den Code nicht erahnen, ob er tut, was man denkt. Ihr solltet alle nur noch Assembler programmieren!“

Re: [C#] Übernatürliche Erscheinungen durch Threading

Verfasst: 16.02.2017, 22:17
von xq
Krishty hat mit Punkt 4 recht. Lambdas ziehen immer eine Referenz auf Variablen, nie eine Kopie. Damit ist deine Iterationsvariable auch im Thread inkrementiert.
Abhilfe schafft kopie in eine lokale variable im scope (die wird jedes mal "neu" erzeugt oder du übergibst ordentliche parameter an deinen thread ;)

Re: [C#] Übernatürliche Erscheinungen durch Threading

Verfasst: 17.02.2017, 09:27
von ponx
1000 Dank Krishty, Felix, Zudo! (dass du auch überfragt warst, hat gerade enorm getröstet, ganz ehrlich! :) Das aktuelle StoneQuest-Video mit den Wind-Effekten ist der absolute Hammer)
Super Leute, der Gedanke, dass es sich benimmt, als ob es Referenzen wären, kam mir auch schon ganz dunkel, aber hätte niemals gedacht, dass sie das tatsächlich so implementiert haben... übel! Mache mich gleich ans Werk! Ich liebe euch! <3