Delen via


CThreadPool-klasse

Opmerking

De ATL (Active Template Library) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Deze klasse biedt een groep werkthreads die een wachtrij met werkitems verwerken.

Syntaxis

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

Parameterwaarden

Arbeider
De klasse die voldoet aan het archetype van de werkrol die de code levert die wordt gebruikt voor het verwerken van werkitems in de wachtrij in de threadgroep.

ThreadTraits
De klasse die de functie levert die wordt gebruikt om de threads in de pool te maken.

Leden

Openbare constructors

Naam Description
CThreadPool::CThreadPool De constructor voor de threadpool.
CThreadPool::~CThreadPool De destructor voor de threadpool.

Openbare methoden

Naam Description
CThreadPool::AddRef Implementatie van IUnknown::AddRef.
CThreadPool::GetNumThreads Roep deze methode aan om het aantal threads in de pool op te halen.
CThreadPool::GetQueueHandle Roep deze methode aan om de ingang op te halen van de IO-voltooiingspoort die wordt gebruikt om werkitems in de wachtrij te plaatsen.
CThreadPool::GetSize Roep deze methode aan om het aantal threads in de pool op te halen.
CThreadPool::GetTimeout Roep deze methode aan om de maximale tijd in milliseconden te krijgen die de threadgroep wacht totdat een thread is afgesloten.
CThreadPool::Initialiseren Roep deze methode aan om de threadgroep te initialiseren.
CThreadPool::QueryInterface Implementatie van IUnknown::QueryInterface.
CThreadPool::QueueRequest Roep deze methode aan om een werkitem in de wachtrij te plaatsen dat moet worden verwerkt door een thread in de pool.
CThreadPool::Release Implementatie van IUnknown::Release.
CThreadPool::SetSize Roep deze methode aan om het aantal threads in de pool in te stellen.
CThreadPool::SetTimeout Roep deze methode aan om de maximale tijd in milliseconden in te stellen die de threadgroep wacht tot een thread is afgesloten.
CThreadPool::Afsluiten Roep deze methode aan om de threadgroep af te sluiten.

Opmerkingen

Threads in de pool worden gemaakt en vernietigd wanneer de pool wordt geïnitialiseerd, gewijzigd of afgesloten. Er wordt een exemplaar van class Worker gemaakt op de stack van elke werkrolthread in de pool. Elk exemplaar leeft gedurende de levensduur van de thread.

Onmiddellijk na het maken van een thread wordt Worker::Initialize aangeroepen op het object dat aan die thread is gekoppeld. Onmiddellijk voordat een thread wordt vernietigd, wordt Worker::Terminate aangeroepen. Beide methoden moeten een void* argument accepteren. De waarde van dit argument wordt doorgegeven aan de threadpool via de parameter pvWorkerParam van CThreadPool::Initialize.

Wanneer er werkitems in de wachtrij en werkrolthreads beschikbaar zijn voor werk, haalt een werkthread een item uit de wachtrij en roept u de Execute methode van het Worker-object voor die thread aan. Er worden vervolgens drie items doorgegeven aan de methode: het item uit de wachtrij, hetzelfde pvWorkerParam dat wordt doorgegeven aan Worker:: Initialize en Worker:: Terminateen een aanwijzer naar de overlappende structuur die wordt gebruikt voor de wachtrij met io-voltooiingspoorten.

De werkrolklasse declareert het type van de items die in de wachtrij worden geplaatst in de threadgroep door een typedef, Worker:: RequestTypeop te geven. Dit type moet kunnen worden gegoten naar en van een ULONG_PTR.

Een voorbeeld van een werkrolklasse is CNonStatelessWorker Class.

Overnamehiërarchie

IUnknown

IThreadPoolConfig

CThreadPool

Requirements

Header: atlutil.h

CThreadPool::AddRef

Implementatie van IUnknown::AddRef.

ULONG STDMETHODCALLTYPE AddRef() throw();

Retourwaarde

Geeft altijd 1 terug.

Opmerkingen

Deze klasse implementeert geen levensduurbeheer met verwijzing tellen.

CThreadPool::CThreadPool

De constructor voor de threadpool.

CThreadPool() throw();

Opmerkingen

Initialiseert de time-outwaarde tot ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. De standaardtijd is 36 seconden. Indien nodig kunt u uw eigen positieve gehele getal voor dit symbool definiëren voordat u atlutil.h opgeeft.

CThreadPool::~CThreadPool

De destructor voor de threadpool.

~CThreadPool() throw();

Opmerkingen

Roept CThreadPool::Shutdown aan.

CThreadPool::GetNumThreads

Roep deze methode aan om het aantal threads in de pool op te halen.

int GetNumThreads() throw();

Retourwaarde

Retourneert het aantal threads in de pool.

CThreadPool::GetQueueHandle

Roep deze methode aan om de ingang op te halen van de IO-voltooiingspoort die wordt gebruikt om werkitems in de wachtrij te plaatsen.

HANDLE GetQueueHandle() throw();

Retourwaarde

Retourneert de wachtrijgreep of NULL als de threadgroep niet is geïnitialiseerd.

CThreadPool::GetSize

Roep deze methode aan om het aantal threads in de pool op te halen.

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

Parameterwaarden

pnNumThreads
[uit] Adres van de variabele die bij succes het aantal threads in de pool ontvangt.

Retourwaarde

Retourneert S_OK bij succes of een fout HRESULT bij fout.

CThreadPool::GetTimeout

Roep deze methode aan om de maximale tijd in milliseconden te krijgen die de threadgroep wacht totdat een thread is afgesloten.

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

Parameterwaarden

pdwMaxWait
[uit] Adres van de variabele die, bij succes, de maximale tijd ontvangt in milliseconden dat de threadgroep wacht tot een thread is afgesloten.

Retourwaarde

Retourneert S_OK bij succes of een fout HRESULT bij fout.

Opmerkingen

Deze time-outwaarde wordt gebruikt door CThreadPool::Shutdown als er geen andere waarde wordt opgegeven voor die methode.

CThreadPool::Initialiseren

Roep deze methode aan om de threadgroep te initialiseren.

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

Parameterwaarden

pvWorkerParam
De werkrolparameter die moet worden doorgegeven aan de werkrolthreadobjecten InitializeExecuteen Terminate methoden.

nNumThreads
Het aangevraagde aantal threads in de pool.

Als nNumThreads negatief is, wordt de absolute waarde vermenigvuldigd met het aantal processors in de machine om het totale aantal threads op te halen.

Als nNumThreads nul is, wordt ATLS_DEFAULT_THREADSPERPROC vermenigvuldigd met het aantal processors op de computer om het totale aantal threads op te halen. De standaardwaarde is 2 threads per processor. Indien nodig kunt u uw eigen positieve gehele getal voor dit symbool definiëren voordat u atlutil.h opgeeft.

dwStackSize
De stapelgrootte voor elke thread in de pool.

hCompletion
De ingang van een object dat moet worden gekoppeld aan de voltooiingspoort.

Retourwaarde

Retourneert S_OK bij succes of een fout HRESULT bij fout.

CThreadPool::QueryInterface

Implementatie van IUnknown::QueryInterface.

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

Opmerkingen

Objecten van deze klasse kunnen worden opgevraagd voor de IUnknown interfaces IThreadPoolConfig .

CThreadPool::QueueRequest

Roep deze methode aan om een werkitem in de wachtrij te plaatsen dat moet worden verwerkt door een thread in de pool.

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

Parameterwaarden

verzoek
De aanvraag die in de wachtrij moet worden geplaatst.

Retourwaarde

Retourneert TRUE bij succes, ONWAAR bij mislukt.

Opmerkingen

Met deze methode wordt een werkitem aan de wachtrij toegevoegd. De threads in de pool kiezen items uit de wachtrij in de volgorde waarin ze worden ontvangen.

CThreadPool::Release

Implementatie van IUnknown::Release.

ULONG STDMETHODCALLTYPE Release() throw();

Retourwaarde

Geeft altijd 1 terug.

Opmerkingen

Deze klasse implementeert geen levensduurbeheer met verwijzing tellen.

CThreadPool::SetSize

Roep deze methode aan om het aantal threads in de pool in te stellen.

HRESULT STDMETHODCALLTYPE SetSize(int nNumThreads) throw();

Parameterwaarden

nNumThreads
Het aangevraagde aantal threads in de pool.

Als nNumThreads negatief is, wordt de absolute waarde vermenigvuldigd met het aantal processors in de machine om het totale aantal threads op te halen.

Als nNumThreads nul is, wordt ATLS_DEFAULT_THREADSPERPROC vermenigvuldigd met het aantal processors op de computer om het totale aantal threads op te halen. De standaardwaarde is 2 threads per processor. Indien nodig kunt u uw eigen positieve gehele getal voor dit symbool definiëren voordat u atlutil.h opgeeft.

Retourwaarde

Retourneert S_OK bij succes of een fout HRESULT bij fout.

Opmerkingen

Als het aantal opgegeven threads kleiner is dan het aantal threads dat zich momenteel in de groep bevindt, plaatst het object een afsluitbericht in de wachtrij dat moet worden opgehaald door een wachtende thread. Wanneer een wachtende thread het bericht uit de wachtrij haalt, wordt de threadgroep op de hoogte gesteld en wordt de threadprocedure afgesloten. Dit proces wordt herhaald totdat het aantal threads in de pool het opgegeven nummer bereikt of totdat er geen thread is afgesloten binnen de periode die is opgegeven door GetTimeout/ SetTimeout. In deze situatie retourneert de methode een HRESULT die overeenkomt met WAIT_TIMEOUT en wordt het bericht voor afsluiten in behandeling geannuleerd.

CThreadPool::SetTimeout

Roep deze methode aan om de maximale tijd in milliseconden in te stellen die de threadgroep wacht tot een thread is afgesloten.

HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();

Parameterwaarden

dwMaxWait
De aangevraagde maximale tijd in milliseconden dat de threadpool wacht tot een thread is afgesloten.

Retourwaarde

Retourneert S_OK bij succes of een fout HRESULT bij fout.

Opmerkingen

De time-out wordt geïnitialiseerd voor ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. De standaardtijd is 36 seconden. Indien nodig kunt u uw eigen positieve gehele getal voor dit symbool definiëren voordat u atlutil.h opgeeft.

Houd er rekening mee dat dwMaxWait de tijd is waarop de pool wacht tot één thread is afgesloten. De maximale tijd die kan worden genomen om meerdere threads uit de pool te verwijderen, kan iets kleiner zijn dan dwMaxWait vermenigvuldigd met het aantal threads.

CThreadPool::Afsluiten

Roep deze methode aan om de threadgroep af te sluiten.

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

Parameterwaarden

dwMaxWait
De aangevraagde maximale tijd in milliseconden dat de threadpool wacht tot een thread is afgesloten. Als er 0 of geen waarde wordt opgegeven, gebruikt deze methode de time-out die is ingesteld door CThreadPool::SetTimeout.

Opmerkingen

Met deze methode wordt een afsluitaanvraag op alle threads in de pool geplaatst. Als de time-out verloopt, roept deze methode TerminateThread aan op een thread die niet is afgesloten. Deze methode wordt automatisch aangeroepen vanuit de destructor van de klasse.

Zie ook

IThreadPoolConfig-interface
DefaultThreadTraits
Klassen