Condividi tramite


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:: Terminatee 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

IThreadPoolConfig

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 , Executee Terminate dell'oggetto thread di Initializelavoro.

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 .

Vedi anche

Interfaccia IThreadPoolConfig
DefaultThreadTraits
Classi