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.

Consulte también

Gráfico de jerarquías