Freigeben über


CThreadPool-Klasse

Diese Klasse stellt einen Pool von Arbeitsthreads bereit, die eine Warteschlange mit Arbeitsaufgaben verarbeiten.

Syntax

template <class Worker, class ThreadTraits = DefaultThreadTraits>
class CThreadPool : public IThreadPoolConfig

Parameter

Arbeitskraft
Die Klasse, die dem Worker-Archetyp entspricht, der den Code bereitstellt, der zum Verarbeiten von Arbeitsaufgaben verwendet wird, die im Threadpool in die Warteschlange gestellt werden.

Threadeigenschaften
Die Klasse, die die Funktion bereitstellt, die zum Erstellen der Threads im Pool verwendet wird.

Member

Öffentliche Konstruktoren

Name Beschreibung
CThreadPool::CThreadPool Der Konstruktor für den Threadpool.
CThreadPool::~CThreadPool Der Destruktor für den Threadpool.

Öffentliche Methoden

Name Beschreibung
CThreadPool::AddRef Implementierung von IUnknown::AddRef.
CThreadPool::GetNumThreads Rufen Sie diese Methode auf, um die Anzahl der Threads im Pool abzurufen.
CThreadPool::GetQueueHandle Rufen Sie diese Methode auf, um das Handle des E/A-Vervollständigungsports abzurufen, der für die Warteschlange von Arbeitsaufgaben verwendet wird.
CThreadPool::GetSize Rufen Sie diese Methode auf, um die Anzahl der Threads im Pool abzurufen.
CThreadPool::GetTimeout Rufen Sie diese Methode auf, um die maximale Zeit in Millisekunden abzurufen, die der Threadpool auf das Herunterfahren eines Threads wartet.
CThreadPool::Initialize Rufen Sie diese Methode auf, um den Threadpool zu initialisieren.
CThreadPool::QueryInterface Implementierung von IUnknown::QueryInterface.
CThreadPool::QueueRequest Rufen Sie diese Methode auf, um eine Arbeitsaufgabe in die Warteschlange zu stellen, die von einem Thread im Pool verarbeitet werden soll.
CThreadPool::Release Implementierung von IUnknown::Release.
CThreadPool::SetSize Rufen Sie diese Methode auf, um die Anzahl der Threads im Pool festzulegen.
CThreadPool::SetTimeout Rufen Sie diese Methode auf, um die maximale Zeit in Millisekunden festzulegen, die der Threadpool auf das Herunterfahren eines Threads wartet.
CThreadPool::Shutdown Rufen Sie diese Methode auf, um den Threadpool herunterzufahren.

Hinweise

Threads im Pool werden erstellt und zerstört, wenn der Pool initialisiert, die Größe geändert oder heruntergefahren wird. Eine Instanz von Class Worker wird im Stapel jedes Arbeitsthreads im Pool erstellt. Jede Instanz wird für die Lebensdauer des Threads live.

Unmittelbar nach der Erstellung eines Threads wird Worker::Initialize für das diesem Thread zugeordnete Objekt aufgerufen. Unmittelbar vor der Zerstörung eines Threads wird Worker::Terminate aufgerufen. Beide Methoden müssen ein void* Argument akzeptieren. Der Wert dieses Arguments wird über den pvWorkerParam-Parameter von CThreadPool::Initialize an den Threadpool übergeben.

Wenn Arbeitsaufgaben in der Warteschlange und Arbeitsthreads für die Arbeit verfügbar sind, ruft ein Workerthread ein Element aus der Warteschlange ab und ruft die Execute Methode des Worker-Objekts für diesen Thread auf. Anschließend werden drei Elemente an die Methode übergeben: das Element aus der Warteschlange, dasselbe an Worker:: und Worker:: Initialize Terminateund einen Zeiger auf die FÜR die E/A-Vervollständigungsportwarteschlange verwendete ÜBERLAPPENDE Struktur.pvWorkerParam

Die Worker-Klasse deklariert den Typ der Elemente, die im Threadpool in die Warteschlange gestellt werden, indem eine Typedef, Worker:: RequestTypebereitgestellt wird. Dieser Typ muss in eine ULONG_PTR umwandeln können.

Ein Beispiel für eine Worker-Klasse ist CNonStatelessWorker Class.

Vererbungshierarchie

IUnknown

IThreadPoolConfig

CThreadPool

Anforderungen

Header: atlutil.h

CThreadPool::AddRef

Implementierung von IUnknown::AddRef.

ULONG STDMETHODCALLTYPE AddRef() throw();

Rückgabewert

Gibt immer 1 zurück.

Hinweise

Diese Klasse implementiert kein Lebensdauersteuerelement mithilfe der Verweiszählung.

CThreadPool::CThreadPool

Der Konstruktor für den Threadpool.

CThreadPool() throw();

Hinweise

Initialisiert den Timeoutwert für ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. Die Standardzeit beträgt 36 Sekunden. Bei Bedarf können Sie einen eigenen positiven ganzzahligen Wert für dieses Symbol definieren, bevor Sie atlutil.h einschließen.

CThreadPool::~CThreadPool

Der Destruktor für den Threadpool.

~CThreadPool() throw();

Hinweise

Ruft CThreadPool::Shutdown auf.

CThreadPool::GetNumThreads

Rufen Sie diese Methode auf, um die Anzahl der Threads im Pool abzurufen.

int GetNumThreads() throw();

Rückgabewert

Gibt die Anzahl der Threads im Pool zurück.

CThreadPool::GetQueueHandle

Rufen Sie diese Methode auf, um das Handle des E/A-Vervollständigungsports abzurufen, der für die Warteschlange von Arbeitsaufgaben verwendet wird.

HANDLE GetQueueHandle() throw();

Rückgabewert

Gibt das Warteschlangenhandle oder NULL zurück, wenn der Threadpool nicht initialisiert wurde.

CThreadPool::GetSize

Rufen Sie diese Methode auf, um die Anzahl der Threads im Pool abzurufen.

HRESULT STDMETHODCALLTYPE GetSize(int* pnNumThreads) throw();

Parameter

pnNumThreads
[out] Adresse der Variablen, die bei Erfolg die Anzahl der Threads im Pool empfängt.

Rückgabewert

S_OK bei Erfolg, ein HRESULT-Fehler bei einem Fehlschlag.

CThreadPool::GetTimeout

Rufen Sie diese Methode auf, um die maximale Zeit in Millisekunden abzurufen, die der Threadpool auf das Herunterfahren eines Threads wartet.

HRESULT STDMETHODCALLTYPE GetTimeout(DWORD* pdwMaxWait) throw();

Parameter

pdwMaxWait
[out] Adresse der Variablen, die bei Erfolg die maximale Zeit in Millisekunden empfängt, die der Threadpool wartet, bis ein Thread heruntergefahren wird.

Rückgabewert

S_OK bei Erfolg, ein HRESULT-Fehler bei einem Fehlschlag.

Hinweise

Dieser Timeoutwert wird von CThreadPool::Shutdown verwendet, wenn dieser Methode kein anderer Wert bereitgestellt wird.

CThreadPool::Initialize

Rufen Sie diese Methode auf, um den Threadpool zu initialisieren.

HRESULT Initialize(
    void* pvWorkerParam = NULL,
    int nNumThreads = 0,
    DWORD dwStackSize = 0,
    HANDLE hCompletion = INVALID_HANDLE_VALUE) throw();

Parameter

pvWorkerParam
Der Workerparameter, der an die Methoden des Workerthreadobjekts InitializeExecuteübergeben Terminate werden soll.

nNumThreads
Die angeforderte Anzahl von Threads im Pool.

Wenn nNumThreads negativ ist, wird der absolute Wert mit der Anzahl der Prozessoren auf dem Computer multipliziert, um die Gesamtanzahl der Threads abzurufen.

Wenn nNumThreads null ist, wird ATLS_DEFAULT_THREADSPERPROC mit der Anzahl der Prozessoren auf dem Computer multipliziert, um die Gesamtanzahl der Threads abzurufen. Der Standardwert ist 2 Threads pro Prozessor. Bei Bedarf können Sie einen eigenen positiven ganzzahligen Wert für dieses Symbol definieren, bevor Sie atlutil.h einschließen.

dwStackSize
Die Stapelgröße für jeden Thread im Pool.

hCompletion
Das Handle eines Objekts, das dem Abschlussport zugeordnet werden soll.

Rückgabewert

S_OK bei Erfolg, ein HRESULT-Fehler bei einem Fehlschlag.

CThreadPool::QueryInterface

Implementierung von IUnknown::QueryInterface.

HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) throw();

Hinweise

Objekte dieser Klasse können erfolgreich für die IUnknown IThreadPoolConfig-Schnittstellen abgefragt werden.

CThreadPool::QueueRequest

Rufen Sie diese Methode auf, um eine Arbeitsaufgabe in die Warteschlange zu stellen, die von einem Thread im Pool verarbeitet werden soll.

BOOL QueueRequest(Worker::RequestType request) throw();

Parameter

request
Die Anforderung, die in die Warteschlange gestellt werden soll.

Rückgabewert

Gibt WAHR für Erfolg, FALSE bei Fehler zurück.

Hinweise

Diese Methode fügt der Warteschlange eine Arbeitsaufgabe hinzu. Die Threads im Pool wählen Elemente aus der Warteschlange in der Reihenfolge aus, in der sie empfangen werden.

CThreadPool::Release

Implementierung von IUnknown::Release.

ULONG STDMETHODCALLTYPE Release() throw();

Rückgabewert

Gibt immer 1 zurück.

Hinweise

Diese Klasse implementiert kein Lebensdauersteuerelement mithilfe der Verweiszählung.

CThreadPool::SetSize

Rufen Sie diese Methode auf, um die Anzahl der Threads im Pool festzulegen.

HRESULT STDMETHODCALLTYPE SetSizeint nNumThreads) throw();

Parameter

nNumThreads
Die angeforderte Anzahl von Threads im Pool.

Wenn nNumThreads negativ ist, wird der absolute Wert mit der Anzahl der Prozessoren auf dem Computer multipliziert, um die Gesamtanzahl der Threads abzurufen.

Wenn nNumThreads null ist, wird ATLS_DEFAULT_THREADSPERPROC mit der Anzahl der Prozessoren auf dem Computer multipliziert, um die Gesamtanzahl der Threads abzurufen. Der Standardwert ist 2 Threads pro Prozessor. Bei Bedarf können Sie einen eigenen positiven ganzzahligen Wert für dieses Symbol definieren, bevor Sie atlutil.h einschließen.

Rückgabewert

S_OK bei Erfolg, ein HRESULT-Fehler bei einem Fehlschlag.

Hinweise

Wenn die anzahl der angegebenen Threads kleiner als die Anzahl der Threads ist, die sich derzeit im Pool befinden, fügt das Objekt eine Herunterfahren-Nachricht in die Warteschlange ein, die von einem Wartethread aufgenommen werden soll. Wenn ein wartender Thread die Nachricht aus der Warteschlange zieht, benachrichtigt er den Threadpool und beendet die Threadprozedur. Dieser Vorgang wird wiederholt, bis die Anzahl der Threads im Pool die angegebene Anzahl erreicht oder bis kein Thread innerhalb des durch GetTimeout/ SetTimeout angegebenen Zeitraums beendet wurde. In diesem Fall gibt die Methode ein HRESULT zurück, das WAIT_TIMEOUT entspricht, und die ausstehende Schließungsmeldung wird abgebrochen.

CThreadPool::SetTimeout

Rufen Sie diese Methode auf, um die maximale Zeit in Millisekunden festzulegen, die der Threadpool auf das Herunterfahren eines Threads wartet.

HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();

Parameter

dwMaxWait
Die angeforderte maximale Zeit in Millisekunden, die der Threadpool wartet, bis ein Thread heruntergefahren wird.

Rückgabewert

S_OK bei Erfolg, ein HRESULT-Fehler bei einem Fehlschlag.

Hinweise

Das Timeout wird für ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT initialisiert. Die Standardzeit beträgt 36 Sekunden. Bei Bedarf können Sie einen eigenen positiven ganzzahligen Wert für dieses Symbol definieren, bevor Sie atlutil.h einschließen.

Beachten Sie, dass dwMaxWait die Zeit ist, zu der der Pool wartet, bis ein einzelner Thread heruntergefahren wird. Die maximale Zeit, die zum Entfernen mehrerer Threads aus dem Pool benötigt werden kann, kann etwas kleiner sein als dwMaxWait multipliziert mit der Anzahl der Threads.

CThreadPool::Shutdown

Rufen Sie diese Methode auf, um den Threadpool herunterzufahren.

void Shutdown(DWORD dwMaxWait = 0) throw();

Parameter

dwMaxWait
Die angeforderte maximale Zeit in Millisekunden, die der Threadpool wartet, bis ein Thread heruntergefahren wird. Wenn 0 oder kein Wert angegeben wird, verwendet diese Methode das von CThreadPool::SetTimeout festgelegte Timeout.

Hinweise

Diese Methode sendet eine Herunterfahren-Anforderung an alle Threads im Pool. Wenn das Timeout abläuft, ruft diese Methode TerminateThread für einen Thread auf, der nicht beendet wurde. Diese Methode wird automatisch vom Destruktor der Klasse aufgerufen.

Siehe auch

IThreadPoolConfig-Schnittstelle
DefaultThreadTraits
Klassen