Ist das Halten von Thread optimal?

7

Die Anwendung hat einen Hilfs-Thread. Dieser Thread ist nicht dazu gedacht, die ganze Zeit zu laufen, aber der Hauptprozess kann ihn sehr oft aufrufen.

Also, meine Frage ist, was ist besser in Bezug auf die CPU-Leistung: suspend Thread, wenn es nicht verwendet wird oder am Leben zu bleiben und WaitForSingleObject Funktion verwenden, um auf ein Signal von Hauptprozess warten?

    
Alex Miller 25.09.2008, 07:03
quelle

6 Antworten

14

Hinsichtlich der verwendeten CPU-Ressourcen sind beide Lösungen gleich - der Thread, der suspendiert ist und der Thread, der in WaitForSingleObject auf ein Objekt wartet, das nicht signalisiert wird, erhalten beide überhaupt keine CPU-Zyklen.

Das heißt, WaitForSingleObject ist fast immer eine bevorzugte Lösung, weil der Code, der es verwendet, viel "natürlicher" sein wird - einfacher zu lesen und leichter zu korrigieren. Das Anhalten / Fortsetzen von Threads kann gefährlich sein, da Sie sehr sorgfältig darauf achten müssen, dass Sie einen Thread in einem Zustand aussetzen, in dem das Aussetzen keinen Schaden verursacht (stellen Sie sich vor, einen Thread zu suspendieren, der gerade einen Mutex hält).

    
Suma 25.09.2008, 08:08
quelle
6

Ich würde annehmen, dass Andrei Delphi nicht zum Schreiben von .NET verwendet und daher Suspend nicht in System.Threading.Thread.Suspend übersetzt, sondern zu SuspendThread Win32-API.

Ich würde dringend dagegen vorschlagen. Wenn Sie den Thread zu einem beliebigen Zeitpunkt anhalten, wissen Sie nicht, was passieren wird (z. B. können Sie den Thread in einem solchen Zustand anhalten, dass eine freigegebene Ressource blockiert ist). Wenn Sie jedoch bereits wissen, dass der Thread im suspendierbaren Zustand ist, dann verwenden Sie einfach WaitForSingleObject (oder einen anderen WaitFor-Aufruf) - es ist ebenso effektiv wie das Unterbrechen des Threads, dh Thread wird bis zum Aufwachen keine CPU-Zeit verbrauchen.

    
gabr 25.09.2008 08:01
quelle
1

Was meinst du mit "aussetzen"? WaitForSingleObject wird den Thread anhalten, d. H. Er wird keine CPU verbrauchen, bis das Signal eintrifft.

    
zvrba 25.09.2008 07:09
quelle
1

Wenn es sich bei einem Worker-Thread um externe Arbeitseinheiten handelt, sollten unbedingt Signalisierungsobjekte verwendet werden, um sicherzustellen, dass die CPU nicht unnötig verwendet wird.

Wenn es auch etwas von seiner eigenen Arbeit zu tun hat, ist das eine andere Sache. Ich würde den Thread nicht aus einem anderen Thread aussetzen (was passiert, wenn zwei Threads Arbeit liefern?) - Meine Grundregel ist, dass Threads ihre eigene Lebensdauer mit Vorschlägen von anderen Threads steuern sollten. Dies lokalisiert alle Kontrolle im Thread selbst.

    
paxdiablo 25.09.2008 07:11
quelle
1

Sehen Sie sich das hervorragende Tutorial zu Multithreading in Delphi an: Multi Threading Tutorial

    
Steve 30.09.2008 12:07
quelle
0

Eine weitere Option wäre der in Delphi 2009 eingeführte TMonitor, der Funktionen wie Wait, Pulse und PulseAll bietet, um Threads inaktiv zu halten, wenn nichts für sie zu tun ist, und sie zu benachrichtigen, sobald sie mit ihrer Arbeit fortfahren. Es ist lose modelliert, nachdem das Objekt in Java gesperrt wurde. Wie dort, haben Delphi-Objekte jetzt ein "Lock" -Feld, das für die Thread-Synchronisation verwendet werden kann.

Ein Blog, der ein Beispiel für eine Warteschlangen-Thread-Klasse gibt, finden Sie unter Ссылка

Leider gab es einen Fehler in der TMonitor-Implementierung, der anscheinend in XE2 behoben wurde

    
mjn 11.09.2011 09:59
quelle