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
Terminate
und 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:: RequestType
bereitgestellt wird. Dieser Typ muss in eine ULONG_PTR umwandeln können.
Ein Beispiel für eine Worker-Klasse ist CNonStatelessWorker Class.
Vererbungshierarchie
IUnknown
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 Initialize
Execute
ü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.