Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Do 15.05.14 22:47 
Liebe Experten,

ich möchte eine umfangreiche Rechenaufgabe auf viele Kerne einer CPU verteilen, also mache ich mehrere Threads.

Bsp.: Ich suche die "schönste" (wie auch immer) Zahl im Bereich 1... 1 Million, also teile ich das in 1000er-Pakete. Ich starte Thread 1 für 1..1000, dann Thread 2 für 1001..2000 usw.

Jetzt kommt das Problem: Wenn alle Threads beschäftigt sind, dann muss der organisierede Thread warten. Nehme ich "waitfor" auf Event, Mutex, Semaphore. Mein Problem liegt in den Rechen-Threads: Der sieht ja etwa so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Procedure Excecute;
REPEAT
  Suche_schönste_Zahl_im Bereich;
  Setze Event/Mutex/Semaphore;
  suspend;
UNTIL ewig; {klar, Terminated usw. wird abgefragt}
END;


NUN: Was passiert, wenn zwischen "Setze Event/Mutex/Semaphore" und "suspend" ein Threadwechsel erfolgt? Der übergeordnete organisierende Thread erwacht aus seinem "waitfor", findet aber keinen Thread, der "suspended" ist. Selbst wenn ich eine eigene Variable einrichte und abfrage, dann würde ja das Resume ins Leere laufen.

Klar, mir fallen work-arounds ein, aber das muss doch vom Ansatz her besser gehen. In den reichlich verfügbaren Texten im Internet habe ich nichts zu dieser Frage finden können.

Aber vielleicht ist ja auch mein Ansatz vollkommen falsch???? Evtl. besser den Thread terminieren und jeweils neu starten??? Oder gibt es außer Event, Mutex, Semaphore bessere Alternativen???
Im Prinzip sind solche Aufgagen heute bei Multi-Core-Anwendungen für aktuelle Prozessoren doch dauernd zu lösen. Somit hoffe ich auf Tipps und Links auf entsprechende Seiten.

Beste Grüße GuaAck

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 16.05.14 00:56 
Warum beendest du den knusper Thread nicht einfach wenn er fertig ist? Warum suspendieren und Speicher/Systemressourcen blockieren? Zudem ist suspended in neueren Version von Delphi als veraltet markiert.
Vor dem Beenden sendest du dann ein Event das dem Hauptthread sagt das wieder Platz auf der CPU ist und weitere arbeit vergeben werden kann.
Oder du verwendest TCriticalSection um eine globale Bariable hoch oder runter zu zählen. Die wird dann im Haupttread überwacht und neue abeit erzeugt. Mit TCriticalSection ist es auch möglich die Ergebnisse in eine globale Liste zu schreiben ohne das ein anderer Thread in die Quere kommen kann. Allerdings kann das zum Flaschenhals werden wenn die Arbeitsthreads zu schnell fertig sind. Da sie ihre Daten ja nur einer nach dem anderen schreiben können.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 16.05.14 07:33 
Das Stichwort ist Threadpool, da gibt es auch schon fertige Implementierungen, eine umfangreiche z.B. drüben in der Delphipraxis. Ich muss los, deshalb kann ich grad nicht mehr schreiben.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Fr 16.05.14 18:53 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das Stichwort ist Threadpool, da gibt es auch schon fertige Implementierungen, eine umfangreiche z.B. drüben in der Delphipraxis. Ich muss los, deshalb kann ich grad nicht mehr schreiben.
Ich arbeite z.B. sehr gern mit der mittlerweile eingestellten AsyncCall (da ist das gradezu trivial, da du eine lokale bzw anonyme Prozedur für die Berechnung nehmen kannst), die OmniThreadLibrary taucht auch immer mal wieder auf (für die sind aber meine Delphis zu alt).

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."