![]() |
AW: Threadunterbrechung - nicht mit suspend
Ja, das ist ein Knackpunkt, ging mir nicht anders - aber auch ein Durchbruch, wenn man es verinnerlicht hat.
Jeder Thread hat ein Handle. Die Idee ist es jetzt, die Threads zu starten und sich die Handles in einem Array zu merken. Dieses Array reicht man dann an eine API-Funktion wie "WaitForMultipleObjects()", die wartet, bis alle Threads fertig sind. Das Warten selbst ist zwar blockierend, verbraucht aber (so gut wie) keine CPU-Zyklen. Nach diesem Schema ist sichergestellt, dass alle Threads frei arbeiten können - im Rahmen dessen, was das Betriebssystem und der Prozessor eben hergeben. In diesem Fall dürfen sich die Threads allerdings nicht selbst freigeben, da Windows sonst keine Chance hat, deren Status abzufragen. DP, EE und DT haben einige Einträge und Beispiele zu "WaitForMultipleObjects()". Ich empfand deren Lektüre als sehr erhellend. |
AW: Threadunterbrechung - nicht mit suspend
Nochmals besten Dank!
|
AW: Threadunterbrechung - nicht mit suspend
ich werde immer misstrauisch, wenn man so anfängt zu tricksen um etwas zu erreichen. Dann macht man meist was verkehrt.
|
AW: Threadunterbrechung - nicht mit suspend
Zitat:
|
AW: Threadunterbrechung - nicht mit suspend
In diesem Fall ja.
|
AW: Threadunterbrechung - nicht mit suspend
Hallo Daniel, ich möchte Dich als Administrator über Gebühr beanspruchen, aber dennoch noch etwas einwenden.
Zitat:
Zitat:
Zitat:
Vielleicht habe ich auch ein grundsätzliches Verständnisproblem und erwarte auch nicht, daß Du noch mehr Zeit in diese Diskussion investierst. WaitForMultipleObjects werde ich natürlich weiterhin studieren. |
AW: Threadunterbrechung - nicht mit suspend
Zitat:
Ich bin ab morgen für eine Woche im Urlaub. Von daher kann ich aktuell nicht nennenswert in das Thema einsteigen. Ich müsste jetzt, um sinnvoll antworten zu können, tiefer in Deine Implementation gehen, um konkrete Aspekte ansprechen zu können. Das schaffe ich aktuell zeitlich leider nicht. |
AW: Threadunterbrechung - nicht mit suspend
Zitat:
|
AW: Threadunterbrechung - nicht mit suspend
So, Daniel, Problem (anscheinend) gelöst: Ich habe es mit den CriticalSections wohl doch etwas übertrieben: So umhüllte ich auch synchronize damit. Warum, weiß ich selbst nicht mehr genau, ich probierte eben aus, wie meistens: Nach "Umhüllung" nahezu des gesamten Threadcodes ver- und zerkleinerte ("ziselierte") ich die kritischen Abschnitte soweit, wie es noch stabil blieb, um eine möglichst hohe Gleichzeitigkeit zu ermöglichen - und ja, ich schaute mir dabei natürlich auch an, daß Variablen nicht gleichzeitig lesenden und schreibenden Zugriff durch verschiedene Threads haben könnten, also ganz ohne Verständnis war ich dabei nicht zugange. Synchronize selbst ist aber eine Prozedur, die nach meinem Verständnis exklusiven Zugriff (auf die VCL) benötigt und damit per se als kritisch geschützt sein muß. Vielleicht lief es ohne diese "kritische Umhüllung" nicht stabil genug, jetzt bin ich aber ohne zufrieden.
Es funktioniert jedenfalls jetzt auch unter Windows 7 besser, also spürbar zeitparalleler, und das war mein eigentliches Ziel. Besten Dank noch einmal an alle, die sich so rührend meiner annahmen! Ergänzung: Beim parallelen Mergesort komme ich ohne diese kritische Umhüllung des synchronizes jedenfalls leider nicht aus, ist schon merkwürdig. Ergänzung 2: Man sieht aber sehr schön, daß auch hier nur eine "handverlesene, elitäre Auswahl" an Threads aktiv ist - es werkeln jedenfalls nicht so viele optisch umher, wie m.E. möglich sind. |
AW: Threadunterbrechung - nicht mit suspend
Da hatte ich ja das richtige Gefühl, dass es nicht an Windows liegt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz