[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.
Antworten
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

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

Beitrag 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!!!
Zuletzt geändert von ponx am 17.02.2017, 10:19, insgesamt 1-mal geändert.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

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

Beitrag 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:
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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!“
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

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

Beitrag 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 ;)
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

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

Beitrag 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
Antworten