Clase CThreadPool

Esta clase proporciona un grupo de subprocesos de trabajo que procesan una cola de elementos de trabajo.

Sintaxis

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

Parámetros

Trabajador
La clase que se ajusta al arquetipo de trabajo que proporciona el código usado para procesar los elementos de trabajo en cola en el grupo de subprocesos.

ThreadTraits
Clase que proporciona la función usada para crear los subprocesos en el grupo.

Miembros

Constructores públicos

Nombre Descripción
CThreadPool::CThreadPool Constructor del grupo de subprocesos.
CThreadPool::~CThreadPool Destructor del grupo de subprocesos.

Métodos públicos

Nombre Descripción
CThreadPool::AddRef Implementación de IUnknown::AddRef.
CThreadPool::GetNumThreads Llame a este método para obtener el número de subprocesos del grupo.
CThreadPool::GetQueueHandle Llame a este método para obtener el identificador del puerto de finalización de E/S usado para poner en cola a los elementos de trabajo.
CThreadPool::GetSize Llame a este método para obtener el número de subprocesos del grupo.
CThreadPool::GetTimeout Llame a este método para conseguir el tiempo máximo en milisegundos que el grupo de subprocesos esperará para que se apague un subproceso.
CThreadPool::Initialize Llame a este método para inicializar el grupo de subprocesos.
CThreadPool::QueryInterface Implementación de IUnknown::QueryInterface.
CThreadPool::QueueRequest Llame a este método para poner en cola un elemento de trabajo que un subproceso del grupo controle.
CThreadPool::Release Implementación de IUnknown::Release.
CThreadPool::SetSize Llame a este método para establecer el número de subprocesos del grupo.
CThreadPool::SetTimeout Llame a este método para establecer el tiempo máximo en milisegundos que el grupo de subprocesos esperará para que se apague un subproceso.
CThreadPool::Shutdown Llame a este método para apagar el grupo de subprocesos.

Comentarios

Los subprocesos del grupo se crean y destruyen cuando el grupo se inicializa, se cambia de tamaño o se cierra. Se creará una instancia de la clase Trabajo en la pila de cada subproceso de trabajo del grupo. Cada instancia se mantendrá durante la vigencia del subproceso.

Inmediatamente después de crear un subproceso, se llamará aTrabajo::Initialize en el objeto asociado a ese subproceso. Inmediatamente antes de la destrucción de un subproceso, se llamará a Trabajo::Terminate. Ambos métodos deben aceptar un argumento void*. El valor de este argumento se pasa al grupo de subprocesos a través del parámetro pvWorkerParam de CThreadPool::Initialize.

Cuando haya elementos de trabajo en la cola y subprocesos de trabajo disponibles para el trabajo, un subproceso de trabajo extraerá un elemento de la cola y lo llamará al Execute método del objeto Trabajo para ese subproceso. A continuación, se pasan tres elementos al método: el elemento de la cola, el mismo pvWorkerParam que se pasa a Trabajo:: Initialize y Trabajo:: Terminate y un puntero a la estructura SUPERPUESTA usada para la cola de puertos de finalización de E/S.

La clase Trabajo declara el tipo de los elementos que se pondrán en cola en el grupo de subprocesos al proporcionar una definición de tipos, Trabajo:: RequestType. Este tipo debe ser capaz de convertirse en y desde un ULONG_PTR.

Un ejemplo de una clase Trabajo es CNonStatelessWorker Class.

Jerarquía de herencia

IUnknown

IThreadPoolConfig

CThreadPool

Requisitos

Header: atlutil.h

CThreadPool::AddRef

Implementación de IUnknown::AddRef.

ULONG STDMETHODCALLTYPE AddRef() throw();

Valor devuelto

Siempre devuelve 1.

Comentarios

Esta clase no implementa el control de duración con el recuento de referencias.

CThreadPool::CThreadPool

Constructor del grupo de subprocesos.

CThreadPool() throw();

Comentarios

Inicializa el valor del tiempo de espera en ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. El tiempo de espera predeterminado es de 36 segundos. Si es necesario, puede definir un valor entero positivo para este símbolo antes de incluir atlutil.h.

CThreadPool::~CThreadPool

Destructor del grupo de subprocesos.

~CThreadPool() throw();

Comentarios

Llama a CThreadPool::Shutdown.

CThreadPool::GetNumThreads

Llame a este método para obtener el número de subprocesos del grupo.

int GetNumThreads() throw();

Valor devuelto

Devuelve el número del grupo de subprocesos.

CThreadPool::GetQueueHandle

Llame a este método para obtener el identificador del puerto de finalización de E/S usado para poner en cola a los elementos de trabajo.

HANDLE GetQueueHandle() throw();

Valor devuelto

Si el grupo de subprocesos no se ha inicializado, devuelve el identificador de cola o NULL.

CThreadPool::GetSize

Llame a este método para obtener el número de subprocesos del grupo.

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

Parámetros

pnNumThreads
[out] Dirección de la variable que, si se ejecuta correctamente, recibe el número de subprocesos del grupo.

Valor devuelto

Devuelve S_OK si es correcto o un error HRESULT en caso de error.

CThreadPool::GetTimeout

Llame a este método para conseguir el tiempo máximo en milisegundos que el grupo de subprocesos esperará para que se apague un subproceso.

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

Parámetros

pdwMaxWait
[out] Dirección de la variable que, si se ejecuta correctamente, recibe el tiempo máximo en milisegundos que el grupo de subprocesos esperará para que se apague un subproceso.

Valor devuelto

Devuelve S_OK si es correcto o un error HRESULT en caso de error.

Comentarios

El valor del tiempo de espera se usa en CThreadPool::Shutdown si no se facilita ningún otro valor a ese método.

CThreadPool::Initialize

Llame a este método para inicializar el grupo de subprocesos.

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

Parámetros

pvWorkerParam
El parámetro de trabajo que se va a pasar subproceso de trabajo del objeto Initialize, Execute y Terminate los métodos.

nNumThreads
El número solicitado por el grupo de subprocesos.

Si nNumThreads es negativo, su valor absoluto se multiplicará por el número de procesadores de la máquina y así obtener el número total de subprocesos.

Si nNumThreads es cero, ATLS_DEFAULT_THREADSPERPROC se multiplicará por el número de procesadores de la máquina y así obtener el número total de subprocesos. El valor predeterminado es 2 subprocesos por procesador. Si es necesario, puede definir un valor entero positivo para este símbolo antes de incluir atlutil.h.

dwStackSize
Tamaño de la pila de cada subproceso del grupo.

hCompletion
Identificador de un objeto para asociarlo al puerto de finalización.

Valor devuelto

Devuelve S_OK si es correcto o un error HRESULT en caso de error.

CThreadPool::QueryInterface

Implementación de IUnknown::QueryInterface.

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

Comentarios

Los objetos de esta clase se pueden consultar correctamente para las IUnknown y las interfaces Y IThreadPoolConfig.

CThreadPool::QueueRequest

Llame a este método para poner en cola un elemento de trabajo que un subproceso del grupo controle.

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

Parámetros

Solicitud
Solicitud que se va a poner en cola.

Valor devuelto

Devuelve TRUE si la operación se realiza correctamente; de lo contrario, devuelve FALSE.

Comentarios

Este método agrega un elemento de trabajo a la cola. Los subprocesos del grupo seleccionan los elementos de la cola en el orden en que los reciben.

CThreadPool::Release

Implementación de IUnknown::Release.

ULONG STDMETHODCALLTYPE Release() throw();

Valor devuelto

Siempre devuelve 1.

Comentarios

Esta clase no implementa el control de duración con el recuento de referencias.

CThreadPool::SetSize

Llame a este método para establecer el número de subprocesos del grupo.

HRESULT STDMETHODCALLTYPE SetSizeint nNumThreads) throw();

Parámetros

nNumThreads
El número solicitado por el grupo de subprocesos.

Si nNumThreads es negativo, su valor absoluto se multiplicará por el número de procesadores de la máquina y así obtener el número total de subprocesos.

Si nNumThreads es cero, ATLS_DEFAULT_THREADSPERPROC se multiplicará por el número de procesadores de la máquina y así obtener el número total de subprocesos. El valor predeterminado es 2 subprocesos por procesador. Si es necesario, puede definir un valor entero positivo para este símbolo antes de incluir atlutil.h.

Valor devuelto

Devuelve S_OK si es correcto o un error HRESULT en caso de error.

Comentarios

Si el número de subprocesos especificados es menor que el número de subprocesos que están actualmente en el grupo, el objeto pone un mensaje de apagado en la cola para que un subproceso en espera lo recoja. Cuando un subproceso en espera extrae el mensaje de la cola, lo notifica al grupo de subprocesos y sale del procedimiento de subproceso. Este proceso se repite hasta que el número de subprocesos del grupo alcanza el número especificado o hasta que no haya salido ningún subproceso dentro del período indicado por GetTimeout/ SetTimeout. En esta situación, el método devolverá un HRESULT que equivale a WAIT_TIMEOUT y se cancelará el mensaje de apagado pendiente.

CThreadPool::SetTimeout

Llame a este método para establecer el tiempo máximo en milisegundos que el grupo de subprocesos esperará para que se apague un subproceso.

HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();

Parámetros

dwMaxWait
El tiempo máximo solicitado en milisegundos que el grupo de subprocesos esperará para que se apague un subproceso.

Valor devuelto

Devuelve S_OK si es correcto o un error HRESULT en caso de error.

Comentarios

El tiempo de espera se inicializa para ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. El tiempo de espera predeterminado es de 36 segundos. Si es necesario, puede definir un valor entero positivo para este símbolo antes de incluir atlutil.h.

Tenga en cuenta que dwMaxWait es el tiempo que el grupo esperará para que se cierre un único subproceso. El tiempo máximo que podría tardar en quitar varios subprocesos del grupo podría ser un poco menor que dwMaxWait multiplicado por el número de subprocesos.

CThreadPool::Shutdown

Llame a este método para apagar el grupo de subprocesos.

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

Parámetros

dwMaxWait
El tiempo máximo solicitado en milisegundos que el grupo de subprocesos esperará para que se apague un subproceso. Si se proporciona 0 o ningún valor, este método usará el tiempo de espera establecido por CThreadPool::SetTimeout.

Comentarios

Este método envía una solicitud de apagado a todos los subprocesos del grupo. Si expira el tiempo de espera, este método llamará a TerminateThread en cualquier subproceso que no se haya salido. Se llama automáticamente a este método desde el destructor de la clase.

Consulte también

IThreadPoolConfig (interfaz)
DefaultThreadTraits
Clases