Clase CMultiLock
Representa el mecanismo de control de acceso utilizado para controlar el acceso a los recursos en un programa de multithreading.
Sintaxis
class CMultiLock
Miembros
Constructores públicos
Nombre | Descripción |
---|---|
CMultiLock::CMultiLock | Construye un objeto CMultiLock . |
Métodos públicos
Nombre | Descripción |
---|---|
CMultiLock::IsLocked | Determina si se bloquea un objeto de sincronización específico de la matriz. |
CMultiLock::Lock | Espera la matriz de objetos de sincronización. |
CMultiLock::Unlock | Libera los objetos de sincronización en propiedad. |
Comentarios
CMultiLock
no tiene una clase base.
Para usar las clases de sincronización CSemaphore, CMutex y CEvent, puede crear un objeto CMultiLock
o CSingleLock para esperar y liberar el objeto de sincronización. Use CMultiLock
cuando haya varios objetos que puede usar en un momento determinado. Use CSingleLock
cuando solo necesite esperar un objeto cada vez.
Para usar un objeto CMultiLock
, cree primero una matriz de los objetos de sincronización que desea esperar. Luego, llame al constructor del objeto CMultiLock
dentro de una función miembro en la clase del recurso controlado. A continuación, llame a la función miembro Lock para determinar si hay un recurso disponible (señalado). Si es así, continúe con el resto de la función miembro. Si no hay ningún recurso disponible, espere una cantidad de tiempo especificada a que se libere un recurso o se devuelva un error. Una vez que se complete el uso de un recurso, llame a la función Unlock si el objeto CMultiLock
se va a volver a usar o permita que se destruya el objeto CMultiLock
.
Los CMultiLock
son más útiles cuando un subproceso tiene un gran número de objetos CEvent
a los que puede responder. Cree una matriz que contenga todos los punteros CEvent
y llame a Lock
. Esto hará que el subproceso espere hasta que se señale uno de los eventos.
Para obtener más información sobre cómo usar los objetos CMultiLock
, vea el artículo Multithreading: Procedimientos para usar las clases de sincronización.
Jerarquía de herencia
CMultiLock
Requisitos
Encabezado: afxmt.h
CMultiLock::CMultiLock
Construye un objeto CMultiLock
.
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
Parámetros
ppObjects
Matriz de punteros a los objetos de sincronización que se van a esperar. No puede ser NULL.
dwCount
Número de objetos en ppObjects. Debe ser mayor que 0.
bInitialLock
Especifica si se intenta acceder inicialmente a cualquiera de los objetos proporcionados.
Comentarios
Se llama a esta función después de crear la matriz de objetos de sincronización que se esperarán. Por lo general, se la llama desde dentro del subproceso que debe esperar a que uno de los objetos de sincronización esté disponible.
CMultiLock::IsLocked
Determina si el objeto especificado no está señalado (no disponible).
BOOL IsLocked(DWORD dwItem);
Parámetros
dwItem
Índice de la matriz de objetos correspondiente al objeto cuyo estado se consulta.
Valor devuelto
Distinto de cero si el objeto especificado está bloqueado; de lo contrario, 0.
CMultiLock::Lock
Llame a esta función para obtener acceso a uno o varios de los recursos controlados por los objetos de sincronización proporcionados al constructor CMultiLock
.
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
Parámetros
dwTimeOut
Especifica la cantidad de tiempo que se debe esperar para que el objeto de sincronización esté disponible (señalado). Si es INFINITE, Lock
esperará hasta que se señale el objeto antes de completarse.
bWaitForAll
Especifica si todos los objetos a los que se espera deben señalarse al mismo tiempo antes de completarse. Si es FALSE, Lock
se completará cuando se señale a cualquiera de los objetos esperados.
dwWakeMask
Especifica otras condiciones que pueden anular la espera. Para una lista de las opciones disponibles para este parámetro, consulte MsgWaitForMultipleObjects en Windows SDK.
Valor devuelto
Si se produce un error de Lock
, devuelve - 1. Si se completa correctamente, el método devuelve uno de los valores siguientes:
Entre WAIT_OBJECT_0 y WAIT_OBJECT_0 + (número de objetos - 1)
Si bWaitForAll es TRUE, se señalan todos los objetos (disponibles). Si bWaitForAll es FALSE, el valor devuelto WAIT_OBJECT_0 es el índice de la matriz de objetos del objeto que se señala (disponible).
WAIT_OBJECT_0 + (número de objetos)
Un evento especificado en dwWakeMask está disponible en la cola de entrada del subproceso.
Entre WAIT_ABANDONED_0 y WAIT_ABANDONED_0 + (número de objetos - 1)
Si bWaitForAll es TRUE, se señalizan todos los objetos y al menos uno de ellos es un objeto de exclusión mutua abandonada. Si bWaitForAll es FALSE, el valor devuelto WAIT_ABANDONED_0 es el índice de la matriz de objetos del objeto de exclusión mutua abandonada que cumplió la espera.
WAIT_TIMEOUT
El intervalo de tiempo de espera especificado en dwTimeOut expiró sin que la espera se complete correctamente.
Comentarios
Si bWaitForAll es TRUE, Lock
se devolverá correctamente tan pronto como todos los objetos de sincronización se señalen de manera simultánea. Si bWaitForAll es FALSE, Lock
se devolverá tan pronto como se señale uno o varios de los objetos de sincronización.
Si Lock
no se puede completar de inmediato, esperará no más allá del número de milisegundos que se especifica en el parámetro dwTimeOut antes de completarse. Si dwTimeOut es INFINITE, Lock
no se completará hasta que se obtenga acceso a un objeto o se cumpla una condición especificada en dwWakeMask. Por otro lado, si Lock
pudo adquirir un objeto de sincronización, se completará correctamente; si no es así, devolverá un error.
CMultiLock::Unlock
Libera el objeto de sincronización propiedad de CMultiLock
.
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Parámetros
lCount
Número de contadores de referencias que se van a liberar. Debe ser mayor que 0. Si la cantidad especificada haría que el contador del objeto supere su máximo, el contador no se modifica y la función devuelve FALSE.
lPrevCount
Apunta a una variable para recibir el contador anterior del objeto de sincronización. Si es NULL, no se devuelve el contador anterior.
Valor devuelto
Distinto de cero si la función se realizó correctamente; de lo contrario, 0.
Comentarios
El destructor de CMultiLock
llama a esta función.
La primera forma de Unlock
intenta desbloquear el objeto de sincronización administrado por CMultiLock
. La segunda forma de Unlock
intenta desbloquear los objetos CSemaphore
propiedad de CMultiLock
. Si CMultiLock
no posee ningún objeto CSemaphore
bloqueado, la función devuelve FALSE; de lo contrario, devuelve TRUE. lCount e lpPrevCount son exactamente los mismos que los parámetros de CSingleLock::Unlock. La segunda forma de Unlock
rara vez se aplica a situaciones de bloqueo múltiple.