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

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.

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

Beitragvon ponx » 16.02.2017, 20:03

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!!!
Zuletzt geändert von ponx am 17.02.2017, 11:19, insgesamt 1-mal geändert.
Benutzeravatar
ponx
Andy Ponx
 
Beiträge: 212
Registriert: 04.05.2008, 12:52
Wohnort: Hamburg

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

Beitragvon Zudomon » 16.02.2017, 21:49

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:
Bild
Benutzeravatar
Zudomon
 
Beiträge: 1925
Registriert: 25.03.2009, 08:20

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

Beitragvon Krishty » 16.02.2017, 22:38

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!“
Sterne rendern (mit Demo) und viele kleine Optimierungen

state is the enemy
Benutzeravatar
Krishty
 
Beiträge: 5535
Registriert: 26.02.2009, 12:18

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

Beitragvon MasterQ32 » 16.02.2017, 23:17

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 ;)
Duct tape is like the force. It has a light side, a dark side, and it holds the world together.
Benutzeravatar
MasterQ32
Felix Queißner
 
Beiträge: 729
Registriert: 07.10.2012, 14:56

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

Beitragvon ponx » 17.02.2017, 10:27

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
Benutzeravatar
ponx
Andy Ponx
 
Beiträge: 212
Registriert: 04.05.2008, 12:52
Wohnort: Hamburg


Zurück zu Algorithmen und Datenstrukturen

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 1 Gast