AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Threadunterbrechung - nicht mit suspend

Threadunterbrechung - nicht mit suspend

Ein Thema von Delphi-Laie · begonnen am 6. Mai 2015 · letzter Beitrag vom 10. Mai 2015
Antwort Antwort
Seite 2 von 3     12 3   
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 21:52
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#12

AW: Threadunterbrechung - nicht mit suspend

  Alt 6. Mai 2015, 21:55
Nochmals besten Dank!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 00:04
ich werde immer misstrauisch, wenn man so anfängt zu tricksen um etwas zu erreichen. Dann macht man meist was verkehrt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#14

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 07:32
ich werde immer misstrauisch, wenn man so anfängt zu tricksen um etwas zu erreichen. Dann macht man meist was verkehrt.
Was meinst Du mit "tricksen"? Meine Idee, Threadunterbrechungen bewußt auszulösen?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 07:39
In diesem Fall ja.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#16

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 14:36
Hallo Daniel, ich möchte Dich als Administrator über Gebühr beanspruchen, aber dennoch noch etwas einwenden.

Dieses Array reicht man dann an eine API-Funktion wie "WaitForMultipleObjects()", die wartet, bis alle Threads fertig sind.
Das spielt bei diesem Algorithmus m.E. nicht die entscheidende Rolle. Jede (Teil-)Menge wird in eine große und kleine Teilmenge partitioniert und der Algorithmus auf beide mit je einem Extrathrad separat losgelassen. Da die beiden Teilmengen nichts mehr miteinander zu tun haben, dürfen auch die beiden Threads völlig unabhängig voneinander ihr Eigenleben entwickeln, den "Vaterthread" interessiert nur noch, ob bzw. daß die gestartet wurden. Vermutlich bist Du studierter Informatiker und weißt über die prinzipielle Funktionsweise dieses Sortieralgorithmus' bestens bescheid. Vor dem Problem, auf das Ende von (jeweils 2) Threads zu warten, um darauf zu reagieren, stand ich hingegen beim parallelen Mergesort, dort bekam ich es auf meine "Bastelweise" gelöst, unter allen mir zur Verfügung stehenden Windowsversionen.

Das Warten selbst ist zwar blockierend, verbraucht aber (so gut wie) keine CPU-Zyklen.
Gut, mein Polling blockiert auch, aber nur solang, bis der (jeweilige) "Tochterthread" gestartet ist. Das wartet keinesfalls, bis dessen Partitionierung oder gar dessen gesamter Code abgearbeitet ist.

Nach diesem Schema ist sichergestellt, dass alle Threads frei arbeiten können - im Rahmen dessen, was das Betriebssystem und der Prozessor eben hergeben.
Das ist bei meiner Lösung m.E. auch gegeben. Ich habe es genauer analysiert: (Jeweils) beide "Tochterthreads" starten (immer erst der linke, dann der rechte), was ich daran erkennen kann, daß es wie das Hornberger Schießen ausgeht, welchen Thread Windows daraufhin abarbeitet (also wiederum partitioniert): Mal ist es der linke, mal der rechte, aber eben immer nur einer zu jedem beliebigen Zeitpunkt. Und das trifft auf alle Threads zu: Windows (7) scheint immer nur einen Thread zu jedem beliebigen Zeitpunkt zur Abarbeitung freizugeben. Das ist das, was ich zuvor schrieb, daß etwas an der Threadablaufsteuerung gegenüber XP verändert worden sein muß. Schade, mir ist kein Taskmanager bekannt, der die Prozessorauslastung threadweise ermittelt bzw. anzeigt, aber in einem solchen müßte erkennbar sein, daß hierbei immer nur ein Thread just am Werkeln ist.

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.

Geändert von Delphi-Laie ( 7. Mai 2015 um 19:33 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 15:15
[...] ich möchte Dich als Administrator über Gebühr beanspruchen [...]

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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#18

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 19:29
Hallo Daniel, ich möchte Dich als Administrator über Gebühr beanspruchen
Volltreffer, ich meinte natürlich nicht beanspruchen - Entschuldigung! Schönen Urlaub!
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#19

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 19:52
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.

Geändert von Delphi-Laie ( 7. Mai 2015 um 20:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#20

AW: Threadunterbrechung - nicht mit suspend

  Alt 7. Mai 2015, 20:57
Da hatte ich ja das richtige Gefühl, dass es nicht an Windows liegt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz