Partager via


CThreadPool, classe

Cette classe fournit un pool de threads de travail qui traitent une file d’attente d’éléments de travail.

Syntaxe

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

Paramètres

Collaborateur
Classe conforme au archétype worker fournissant le code utilisé pour traiter les éléments de travail mis en file d’attente sur le pool de threads.

ThreadTraits
Classe fournissant la fonction utilisée pour créer les threads dans le pool.

Membres

Constructeurs publics

Nom Description
CThreadPool ::CThreadPool Constructeur du pool de threads.
CThreadPool ::~CThreadPool Destructeur du pool de threads.

Méthodes publiques

Nom Description
CThreadPool ::AddRef Implémentation de IUnknown::AddRef.
CThreadPool ::GetNumThreads Appelez cette méthode pour obtenir le nombre de threads dans le pool.
CThreadPool ::GetQueueHandle Appelez cette méthode pour obtenir le handle du port d’achèvement d’E/S utilisé pour mettre en file d’attente les éléments de travail.
CThreadPool ::GetSize Appelez cette méthode pour obtenir le nombre de threads dans le pool.
CThreadPool ::GetTimeout Appelez cette méthode pour obtenir la durée maximale en millisecondes pendant laquelle le pool de threads attend qu’un thread s’arrête.
CThreadPool ::Initialize Appelez cette méthode pour initialiser le pool de threads.
CThreadPool ::QueryInterface Implémentation de IUnknown::QueryInterface.
CThreadPool ::QueueRequest Appelez cette méthode pour mettre en file d’attente un élément de travail à gérer par un thread dans le pool.
CThreadPool ::Release Implémentation de IUnknown::Release.
CThreadPool ::SetSize Appelez cette méthode pour définir le nombre de threads dans le pool.
CThreadPool ::SetTimeout Appelez cette méthode pour définir la durée maximale en millisecondes pendant laquelle le pool de threads attend qu’un thread s’arrête.
CThreadPool ::Shutdown Appelez cette méthode pour arrêter le pool de threads.

Notes

Les threads du pool sont créés et détruits lorsque le pool est initialisé, redimensionné ou arrêté. Une instance de worker de classe est créée sur la pile de chaque thread de travail dans le pool. Chaque instance vit pendant la durée de vie du thread.

Immédiatement après la création d’un thread, Worker ::Initialize sera appelé sur l’objet associé à ce thread. Immédiatement avant la destruction d’un thread, Worker ::Terminate sera appelé. Les deux méthodes doivent accepter un void* argument. La valeur de cet argument est passée au pool de threads via le paramètre pvWorkerParam de CThreadPool ::Initialize.

Lorsqu’il existe des éléments de travail dans la file d’attente et les threads de travail disponibles pour le travail, un thread de travail extrait un élément de la file d’attente et appelle la Execute méthode de l’objet Worker pour ce thread. Trois éléments sont ensuite passés à la méthode : l’élément de la file d’attente, le même pvWorkerParam passé à Worker :: Initialize et Worker :: Terminateet un pointeur vers la structure SE CHEVAUCHER utilisée pour la file d’attente du port d’achèvement d’E/S.

La classe Worker déclare le type des éléments qui seront mis en file d’attente sur le pool de threads en fournissant un typedef, Worker :: RequestType. Ce type doit être capable d’être casté vers et à partir d’un ULONG_PTR.

Un exemple de classe Worker est CNonStatelessWorker, classe.

Hiérarchie d'héritage

IUnknown

IThreadPoolConfig

CThreadPool

Spécifications

En-tête : atlutil.h

CThreadPool ::AddRef

Implémentation de IUnknown::AddRef.

ULONG STDMETHODCALLTYPE AddRef() throw();

Valeur de retour

Retourne toujours 1.

Notes

Cette classe n’implémente pas le contrôle de durée de vie à l’aide du comptage de références.

CThreadPool ::CThreadPool

Constructeur du pool de threads.

CThreadPool() throw();

Notes

Initialise la valeur de délai d’attente pour ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. La durée par défaut est de 36 secondes. Si nécessaire, vous pouvez définir votre propre valeur entière positive pour ce symbole avant d’inclure atlutil.h.

CThreadPool ::~CThreadPool

Destructeur du pool de threads.

~CThreadPool() throw();

Notes

Appelle CThreadPool ::Shutdown.

CThreadPool ::GetNumThreads

Appelez cette méthode pour obtenir le nombre de threads dans le pool.

int GetNumThreads() throw();

Valeur de retour

Retourne le nombre de threads dans le pool.

CThreadPool ::GetQueueHandle

Appelez cette méthode pour obtenir le handle du port d’achèvement d’E/S utilisé pour mettre en file d’attente les éléments de travail.

HANDLE GetQueueHandle() throw();

Valeur de retour

Retourne le handle de file d’attente ou NULL si le pool de threads n’a pas été initialisé.

CThreadPool ::GetSize

Appelez cette méthode pour obtenir le nombre de threads dans le pool.

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

Paramètres

pnNumThreads
[out] Adresse de la variable qui, en cas de réussite, reçoit le nombre de threads dans le pool.

Valeur de retour

Retourne S_OK en cas de réussite ou une erreur HRESULT en cas d’échec.

CThreadPool ::GetTimeout

Appelez cette méthode pour obtenir la durée maximale en millisecondes pendant laquelle le pool de threads attend qu’un thread s’arrête.

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

Paramètres

pdwMaxWait
[out] L’adresse de la variable qui, en cas de réussite, reçoit la durée maximale en millisecondes pendant laquelle le pool de threads attend qu’un thread s’arrête.

Valeur de retour

Retourne S_OK en cas de réussite ou une erreur HRESULT en cas d’échec.

Notes

Cette valeur de délai d’expiration est utilisée par CThreadPool ::Shutdown si aucune autre valeur n’est fournie à cette méthode.

CThreadPool ::Initialize

Appelez cette méthode pour initialiser le pool de threads.

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

Paramètres

pvWorkerParam
Paramètre worker à passer aux méthodes et Terminate aux méthodes de InitializeExecutel’objet thread de travail.

nNumThreads
Nombre demandé de threads dans le pool.

Si nNumThreads est négatif, sa valeur absolue est multipliée par le nombre de processeurs de la machine pour obtenir le nombre total de threads.

Si nNumThreads est égal à zéro, ATLS_DEFAULT_THREADSPERPROC sera multiplié par le nombre de processeurs de la machine pour obtenir le nombre total de threads. La valeur par défaut est de 2 threads par processeur. Si nécessaire, vous pouvez définir votre propre valeur entière positive pour ce symbole avant d’inclure atlutil.h.

dwStackSize
Taille de la pile pour chaque thread du pool.

hCompletion
Handle d’un objet à associer au port d’achèvement.

Valeur de retour

Retourne S_OK en cas de réussite ou une erreur HRESULT en cas d’échec.

CThreadPool ::QueryInterface

Implémentation de IUnknown::QueryInterface.

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

Notes

Les objets de cette classe peuvent être interrogés avec succès pour les IUnknown interfaces IThreadPoolConfig .

CThreadPool ::QueueRequest

Appelez cette méthode pour mettre en file d’attente un élément de travail à gérer par un thread dans le pool.

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

Paramètres

requête
Demande à mettre en file d’attente.

Valeur de retour

Retourne TRUE en cas de réussite, FALSE en cas d’échec.

Notes

Cette méthode ajoute un élément de travail à la file d’attente. Les threads du pool sélectionnent les éléments de la file d’attente dans l’ordre dans lequel ils sont reçus.

CThreadPool ::Release

Implémentation de IUnknown::Release.

ULONG STDMETHODCALLTYPE Release() throw();

Valeur de retour

Retourne toujours 1.

Notes

Cette classe n’implémente pas le contrôle de durée de vie à l’aide du comptage de références.

CThreadPool ::SetSize

Appelez cette méthode pour définir le nombre de threads dans le pool.

HRESULT STDMETHODCALLTYPE SetSizeint nNumThreads) throw();

Paramètres

nNumThreads
Nombre demandé de threads dans le pool.

Si nNumThreads est négatif, sa valeur absolue est multipliée par le nombre de processeurs de la machine pour obtenir le nombre total de threads.

Si nNumThreads est égal à zéro, ATLS_DEFAULT_THREADSPERPROC sera multiplié par le nombre de processeurs de la machine pour obtenir le nombre total de threads. La valeur par défaut est de 2 threads par processeur. Si nécessaire, vous pouvez définir votre propre valeur entière positive pour ce symbole avant d’inclure atlutil.h.

Valeur de retour

Retourne S_OK en cas de réussite ou une erreur HRESULT en cas d’échec.

Notes

Si le nombre de threads spécifiés est inférieur au nombre de threads actuellement présents dans le pool, l’objet place un message d’arrêt dans la file d’attente à récupérer par un thread en attente. Lorsqu’un thread en attente extrait le message de la file d’attente, il avertit le pool de threads et quitte la procédure de thread. Ce processus est répété jusqu’à ce que le nombre de threads du pool atteigne le nombre spécifié ou jusqu’à ce qu’aucun thread ne soit quitté dans la période spécifiée par GetTimeout/ SetTimeout. Dans ce cas, la méthode retourne un HRESULT correspondant à WAIT_TIMEOUT et le message d’arrêt en attente est annulé.

CThreadPool ::SetTimeout

Appelez cette méthode pour définir la durée maximale en millisecondes pendant laquelle le pool de threads attend qu’un thread s’arrête.

HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();

Paramètres

dwMaxWait
Durée maximale demandée en millisecondes pendant laquelle le pool de threads attend l’arrêt d’un thread.

Valeur de retour

Retourne S_OK en cas de réussite ou une erreur HRESULT en cas d’échec.

Notes

Le délai d’attente est initialisé pour ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. La durée par défaut est de 36 secondes. Si nécessaire, vous pouvez définir votre propre valeur entière positive pour ce symbole avant d’inclure atlutil.h.

Notez que dwMaxWait est le moment où le pool attend qu’un thread unique s’arrête. La durée maximale pouvant être prise pour supprimer plusieurs threads du pool peut être légèrement inférieure à dwMaxWait multipliée par le nombre de threads.

CThreadPool ::Shutdown

Appelez cette méthode pour arrêter le pool de threads.

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

Paramètres

dwMaxWait
Durée maximale demandée en millisecondes pendant laquelle le pool de threads attend l’arrêt d’un thread. Si 0 ou aucune valeur n’est fournie, cette méthode utilise le délai d’expiration défini par CThreadPool ::SetTimeout.

Notes

Cette méthode publie une demande d’arrêt à tous les threads du pool. Si le délai d’expiration expire, cette méthode appelle TerminateThread sur tout thread qui n’a pas quitté. Cette méthode est appelée automatiquement à partir du destructeur de la classe.

Voir aussi

IThreadPoolConfig, interface
DefaultThreadTraits
Classes