Pooling von Threads

Es gibt viele Anwendungen, die Threads erstellen, die viel Zeit im Ruhezustand verbringen und auf ein Ereignis warten. Andere Threads können nur in einen Ruhezustand versetzt werden, um regelmäßig aktiviert zu werden, um eine Änderung abzufragen oder status Informationen zu aktualisieren. Threadpooling ermöglicht Es Ihnen, Threads effizienter zu verwenden, indem Sie Ihrer Anwendung einen Pool von Arbeitsthreads bereitstellen, die vom System verwaltet werden. Mindestens ein Thread überwacht die status aller Wartevorgänge, die im Threadpool in die Warteschlange eingereiht werden. Wenn ein Wartevorgang abgeschlossen ist, führt ein Workerthread aus dem Threadpool die entsprechende Rückruffunktion aus.

In diesem Thema wird die ursprüngliche Threadpool-API beschrieben. Die in Windows Vista eingeführte Threadpool-API ist einfacher, zuverlässiger, bietet eine bessere Leistung und bietet mehr Flexibilität für Entwickler. Informationen zur aktuellen Threadpool-API finden Sie unter Threadpools.

Sie können auch Arbeitselemente, die sich nicht auf einen Wartevorgang beziehen, im Threadpool in die Warteschlange stellen. Um anzufordern, dass ein Arbeitselement von einem Thread im Threadpool behandelt wird, rufen Sie die Funktion QueueUserWorkItem auf. Diese Funktion verwendet einen Parameter für die Funktion, die von dem thread aus dem Threadpool ausgewählten Thread aufgerufen wird. Es gibt keine Möglichkeit, ein Arbeitselement abzubrechen, nachdem es in die Warteschlange eingereiht wurde.

Timer-Warteschlangen-Timer und registrierte Wartevorgänge verwenden ebenfalls den Threadpool. Ihre Rückruffunktionen werden im Threadpool in die Warteschlange eingereiht. Sie können auch die BindIoCompletionCallback-Funktion verwenden, um asynchrone E/A-Vorgänge zu veröffentlichen. Nach Abschluss der E/A wird der Rückruf von einem Threadpoolthread ausgeführt.

Der Threadpool wird erstellt, wenn Sie QueueUserWorkItem oder BindIoCompletionCallback zum ersten Mal aufrufen oder wenn ein Timer-Warteschlangen-Timer oder ein registrierter Wartevorgang eine Rückruffunktion in die Warteschlange stellt. Standardmäßig beträgt die Anzahl der Threads, die im Threadpool erstellt werden können, etwa 500. Jeder Thread verwendet die Standardstapelgröße und wird mit der Standardpriorität ausgeführt.

Es gibt zwei Arten von Arbeitsthreads im Threadpool: E/A und Nicht-E/A. Ein E/A-Workerthread ist ein Thread, der in einem warnbaren Wartezustand wartet. Arbeitselemente werden als asynchrone Prozeduraufrufe (APC) in die E/A-Arbeitsthreads eingereiht. Sie sollten ein Arbeitselement in eine Warteschlange mit einem E/A-Workerthread stellen, wenn es in einem Thread ausgeführt werden soll, der in einem warnfähigen Zustand wartet.

Ein Nicht-E/A-Workerthread wartet auf E/A-Abschlussports. Die Verwendung von Nicht-E/A-Workerthreads ist effizienter als die Verwendung von E/A-Arbeitsthreads. Daher sollten Sie nach Möglichkeit Nicht-E/A-Workerthreads verwenden. Sowohl E/A- als auch Nicht-E/A-Workerthreads werden nicht beendet, wenn asynchrone E/A-Anforderungen ausstehen. Beide Arten von Threads können von Arbeitselementen verwendet werden, die asynchrone E/A-Vervollständigungsanforderungen initiieren. Vermeiden Sie es jedoch, asynchrone E/A-Vervollständigungsanforderungen in Nicht-E/A-Arbeitsthreads zu veröffentlichen, wenn die Ausführung sehr lange dauern kann.

Um threadpooling verwenden zu können, müssen die Arbeitselemente und alle von ihnen aufgerufenen Funktionen threadpoolsicher sein. Bei einer sicheren Funktion wird nicht davon ausgegangen, dass es sich bei dem Thread, der sie ausführt, um einen dedizierten oder beständigen Thread handelt. Im Allgemeinen sollten Sie die Verwendung des lokalen Threadspeichers oder das Ausführen eines asynchronen Aufrufs vermeiden, der einen persistenten Thread erfordert, z. B. die RegNotifyChangeKeyValue-Funktion . Solche Funktionen können jedoch in einem dedizierten Thread aufgerufen (von der Anwendung erstellt) oder in einer Warteschlange in einem persistenten Workerthread (mit QueueUserWorkItem mit der Option WT_EXECUTEINPERSISTENTTHREAD) in die Warteschlange gestellt werden.

Warnungsfähige E/A

Asynchrone Prozeduraufrufe

E/A-Abschlussports

Threadpools