2008-09-25 9 views
7

Anwendung hat einen Hilfsfaden. Dieser Thread soll nicht ständig ausgeführt werden, aber der Hauptprozess kann ihn sehr oft aufrufen.Ist das Halten von Thread optimal?

Also, meine Frage ist, was ist besser in Bezug auf CPU-Leistung: suspend Thread, wenn es nicht verwendet wird oder halten Sie es und WaitForSingleObject Funktion verwenden, um auf ein Signal aus Hauptprozess warten?

Antwort

14

In Bezug auf die 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 gesagt, WaitForSingleObject ist fast immer eine bevorzugte Lösung, weil der Code, der es verwendet, viel "natürlicher" sein wird - einfacher zu lesen und einfacher zu machen, richtig zu machen. 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).

1

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

1

Wenn es sich bei einem Worker-Thread um Arbeitseinheiten handelt, die extern an ihn übergeben werden, sollten unbedingt signalisierende Objekte verwendet werden, um sicherzustellen, dass die CPU nicht unnötig verwendet wird.

Wenn es eine eigene 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 Steuerelemente im Thread selbst.

6

Ich würde annehmen, dass Andrei Delphi nicht verwendet, um .NET zu schreiben, und deshalb Suspend nicht zu System.Threading.Thread.Suspend aber zu SuspendThread Win32 API übersetzt.

Ich würde dringend dagegen empfehlen. 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 in einem suspendierbaren Zustand ist, dann verwenden Sie einfach WaitForSingleObject (oder einen anderen WaitFor-Aufruf) - es ist ebenso wirksam wie das Unterbrechen des Threads, d. H. Thread wird null CPU-Zeit verwenden, bis er aktiviert wird.

0

Eine weitere Möglichkeit der TMonitor in Delphi 2009 eingeführt wäre, die Funktionen wie Warten hat, Impuls und PulseAll Threads inaktiv zu halten, wenn nichts da ist, tue für sie und benachrichtige sie, sobald sie mit ihrer Arbeit fortfahren sollen. 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, das

bei http://delphihaven.wordpress.com/2011/05/04/using-tmonitor-1/

Leider ein Fehler in der TMonitor Implementierung war, die in XE2 fixiert zu sein scheint gefunden werden kann ein Beispiel für eine Gewinde Warteschlange Klasse gibt

Verwandte Themen