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 :: Terminate
et 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
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 Initialize
Execute
l’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.