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
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.