Einzelnen Beitrag anzeigen

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