Classe CThreadPool
Questa classe fornisce un pool di thread di lavoro che elaborano una coda di elementi di lavoro.
Sintassi
template <class Worker, class ThreadTraits = DefaultThreadTraits>
class CThreadPool : public IThreadPoolConfig
Parametri
Lavoratore
La classe conforme all'archetipo di lavoro che fornisce il codice usato per elaborare gli elementi di lavoro accodati nel pool di thread.
ThreadTraits
Classe che fornisce la funzione usata per creare i thread nel pool.
Membri
Costruttori pubblici
Nome | Descrizione |
---|---|
CThreadPool::CThreadPool | Costruttore per il pool di thread. |
CThreadPool::~CThreadPool | Distruttore per il pool di thread. |
Metodi pubblici
Nome | Descrizione |
---|---|
CThreadPool::AddRef | Implementazione di IUnknown::AddRef . |
CThreadPool::GetNumThreads | Chiamare questo metodo per ottenere il numero di thread nel pool. |
CThreadPool::GetQueueHandle | Chiamare questo metodo per ottenere l'handle della porta di completamento I/O usata per accodare gli elementi di lavoro. |
CThreadPool::GetSize | Chiamare questo metodo per ottenere il numero di thread nel pool. |
CThreadPool::GetTimeout | Chiamare questo metodo per ottenere il tempo massimo in millisecondi in cui il pool di thread attenderà l'arresto di un thread. |
CThreadPool::Initialize | Chiamare questo metodo per inizializzare il pool di thread. |
CThreadPool::QueryInterface | Implementazione di IUnknown::QueryInterface . |
CThreadPool::QueueRequest | Chiamare questo metodo per accodare un elemento di lavoro da gestire da un thread nel pool. |
CThreadPool::Release | Implementazione di IUnknown::Release . |
CThreadPool::SetSize | Chiamare questo metodo per impostare il numero di thread nel pool. |
CThreadPool::SetTimeout | Chiamare questo metodo per impostare il tempo massimo in millisecondi in cui il pool di thread attenderà l'arresto di un thread. |
CThreadPool::Shutdown | Chiamare questo metodo per arrestare il pool di thread. |
Osservazioni:
I thread nel pool vengono creati e eliminati definitivamente quando il pool viene inizializzato, ridimensionato o arrestato. Verrà creata un'istanza della classe Worker nello stack di ogni thread di lavoro nel pool. Ogni istanza verrà vissuto per la durata del thread.
Subito dopo la creazione di un thread, Worker::Initialize
verrà chiamato sull'oggetto associato a tale thread. Immediatamente prima della distruzione di un thread, Worker::Terminate
verrà chiamato . Entrambi i metodi devono accettare un void
* argomento. Il valore di questo argomento viene passato al pool di thread tramite il parametro pvWorkerParam di CThreadPool::Initialize.
Quando sono presenti elementi di lavoro nella coda e nei thread di lavoro disponibili per il lavoro, un thread di lavoro estrae un elemento dalla coda e chiama il Execute
metodo dell'oggetto Worker per tale thread. Vengono quindi passati tre elementi al metodo : l'elemento dalla coda, lo stesso pvWorkerParam
passato a Worker:: Initialize
e Worker:: Terminate
e un puntatore alla struttura OVERLAPPED usata per la coda delle porte di completamento I/O.
La classe Worker dichiara il tipo di elementi che verranno accodati nel pool di thread fornendo un typedef Worker:: RequestType
. Questo tipo deve essere in grado di eseguire il cast da e verso un ULONG_PTR.
Un esempio di classe Worker è CNonStatelessWorker Class.
Gerarchia di ereditarietà
IUnknown
CThreadPool
Requisiti
Intestazione: atlutil.h
CThreadPool::AddRef
Implementazione di IUnknown::AddRef
.
ULONG STDMETHODCALLTYPE AddRef() throw();
Valore restituito
Restituisce sempre 1.
Osservazioni:
Questa classe non implementa il controllo di durata usando il conteggio dei riferimenti.
CThreadPool::CThreadPool
Costruttore per il pool di thread.
CThreadPool() throw();
Osservazioni:
Inizializza il valore di timeout per ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. L'ora predefinita è 36 secondi. Se necessario, è possibile definire il proprio valore intero positivo per questo simbolo prima di includere atlutil.h.
CThreadPool::~CThreadPool
Distruttore per il pool di thread.
~CThreadPool() throw();
Osservazioni:
Chiama CThreadPool::Shutdown.
CThreadPool::GetNumThreads
Chiamare questo metodo per ottenere il numero di thread nel pool.
int GetNumThreads() throw();
Valore restituito
Restituisce il numero di thread nel pool.
CThreadPool::GetQueueHandle
Chiamare questo metodo per ottenere l'handle della porta di completamento I/O usata per accodare gli elementi di lavoro.
HANDLE GetQueueHandle() throw();
Valore restituito
Restituisce l'handle della coda o NULL se il pool di thread non è stato inizializzato.
CThreadPool::GetSize
Chiamare questo metodo per ottenere il numero di thread nel pool.
HRESULT STDMETHODCALLTYPE GetSize(int* pnNumThreads) throw();
Parametri
pnNumThreads
[out] Indirizzo della variabile che, in caso di esito positivo, riceve il numero di thread nel pool.
Valore restituito
Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.
CThreadPool::GetTimeout
Chiamare questo metodo per ottenere il tempo massimo in millisecondi in cui il pool di thread attenderà l'arresto di un thread.
HRESULT STDMETHODCALLTYPE GetTimeout(DWORD* pdwMaxWait) throw();
Parametri
pdwMaxWait
[out] L'indirizzo della variabile che, in caso di esito positivo, riceve il tempo massimo in millisecondi in cui il pool di thread attenderà l'arresto di un thread.
Valore restituito
Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.
Osservazioni:
Questo valore di timeout viene usato da CThreadPool::Shutdown se non viene fornito alcun altro valore a tale metodo.
CThreadPool::Initialize
Chiamare questo metodo per inizializzare il pool di thread.
HRESULT Initialize(
void* pvWorkerParam = NULL,
int nNumThreads = 0,
DWORD dwStackSize = 0,
HANDLE hCompletion = INVALID_HANDLE_VALUE) throw();
Parametri
pvWorkerParam
Parametro di lavoro da passare ai metodi , Execute
e Terminate
dell'oggetto thread di Initialize
lavoro.
nNumThreads
Numero richiesto di thread nel pool.
Se nNumThreads è negativo, il relativo valore assoluto verrà moltiplicato per il numero di processori nel computer per ottenere il numero totale di thread.
Se nNumThreads è zero, ATLS_DEFAULT_THREADSPERPROC verrà moltiplicato per il numero di processori nel computer per ottenere il numero totale di thread. Il valore predefinito è 2 thread per processore. Se necessario, è possibile definire il proprio valore intero positivo per questo simbolo prima di includere atlutil.h.
dwStackSize
Dimensioni dello stack per ogni thread nel pool.
hCompletion
Handle di un oggetto da associare alla porta di completamento.
Valore restituito
Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.
CThreadPool::QueryInterface
Implementazione di IUnknown::QueryInterface
.
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) throw();
Osservazioni:
Gli oggetti di questa classe possono essere sottoposti a query per le IUnknown
interfacce E IThreadPoolConfig .
CThreadPool::QueueRequest
Chiamare questo metodo per accodare un elemento di lavoro da gestire da un thread nel pool.
BOOL QueueRequest(Worker::RequestType request) throw();
Parametri
request
Richiesta da accodare.
Valore restituito
Restituisce TRUE in caso di esito positivo, FALSE in caso di errore.
Osservazioni:
Questo metodo aggiunge un elemento di lavoro alla coda. I thread nel pool selezionano gli elementi dalla coda nell'ordine in cui vengono ricevuti.
CThreadPool::Release
Implementazione di IUnknown::Release
.
ULONG STDMETHODCALLTYPE Release() throw();
Valore restituito
Restituisce sempre 1.
Osservazioni:
Questa classe non implementa il controllo di durata usando il conteggio dei riferimenti.
CThreadPool::SetSize
Chiamare questo metodo per impostare il numero di thread nel pool.
HRESULT STDMETHODCALLTYPE SetSizeint nNumThreads) throw();
Parametri
nNumThreads
Numero richiesto di thread nel pool.
Se nNumThreads è negativo, il relativo valore assoluto verrà moltiplicato per il numero di processori nel computer per ottenere il numero totale di thread.
Se nNumThreads è zero, ATLS_DEFAULT_THREADSPERPROC verrà moltiplicato per il numero di processori nel computer per ottenere il numero totale di thread. Il valore predefinito è 2 thread per processore. Se necessario, è possibile definire il proprio valore intero positivo per questo simbolo prima di includere atlutil.h.
Valore restituito
Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.
Osservazioni:
Se il numero di thread specificati è minore del numero di thread attualmente presenti nel pool, l'oggetto inserisce un messaggio di arresto nella coda da raccogliere da un thread in attesa. Quando un thread in attesa estrae il messaggio dalla coda, invia una notifica al pool di thread e esce dalla routine del thread. Questo processo viene ripetuto fino a quando il numero di thread nel pool raggiunge il numero specificato o fino a quando nessun thread non viene chiuso entro il periodo specificato da GetTimeout SetTimeout/ . In questa situazione il metodo restituirà un valore HRESULT corrispondente a WAIT_TIMEOUT e il messaggio di arresto in sospeso viene annullato.
CThreadPool::SetTimeout
Chiamare questo metodo per impostare il tempo massimo in millisecondi in cui il pool di thread attenderà l'arresto di un thread.
HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();
Parametri
dwMaxWait
Tempo massimo richiesto in millisecondi in cui il pool di thread attenderà l'arresto di un thread.
Valore restituito
Restituisce S_OK in caso di esito positivo o errore HRESULT in caso di errore.
Osservazioni:
Il timeout viene inizializzato per ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. L'ora predefinita è 36 secondi. Se necessario, è possibile definire il proprio valore intero positivo per questo simbolo prima di includere atlutil.h.
Si noti che dwMaxWait è il momento in cui il pool attenderà l'arresto di un singolo thread. Il tempo massimo che può essere impiegato per rimuovere più thread dal pool potrebbe essere leggermente inferiore a dwMaxWait moltiplicato per il numero di thread.
CThreadPool::Shutdown
Chiamare questo metodo per arrestare il pool di thread.
void Shutdown(DWORD dwMaxWait = 0) throw();
Parametri
dwMaxWait
Tempo massimo richiesto in millisecondi in cui il pool di thread attenderà l'arresto di un thread. Se viene specificato 0 o nessun valore, questo metodo userà il timeout impostato da CThreadPool::SetTimeout.
Osservazioni:
Questo metodo invia una richiesta di arresto a tutti i thread nel pool. Se il timeout scade, questo metodo chiamerà TerminateThread su qualsiasi thread che non è stato chiuso. Questo metodo viene chiamato automaticamente dal distruttore della classe .