Compartir a través de


Clase CSingleLock

Representa el mecanismo de control de acceso utilizado para controlar el acceso a un recurso en un programa de multithreading.

Sintaxis

class CSingleLock

Miembros

Constructores públicos

Nombre Descripción
CSingleLock::CSingleLock Construye un objeto CSingleLock.

Métodos públicos

Nombre Descripción
CSingleLock::IsLocked Determina si el objeto está bloqueado.
CSingleLock::Lock Espera en un objeto de sincronización.
CSingleLock::Unlock Libera un objeto de sincronización.

Comentarios

CSingleLock no tiene una clase base.

Para usar las clases de sincronización CSemaphore, CMutex, CCriticalSection y CEvent, debe crear un objeto CSingleLock o CMultiLock para esperar y liberar el objeto de sincronización. Use CSingleLock cuando solo necesite esperar un objeto cada vez. Use CMultiLock cuando haya varios objetos que puede usar en un momento determinado.

Para usar un objeto CSingleLock, llame al constructor dentro de una función miembro en la clase del recurso controlado. A continuación, llame a la función miembro IsLocked para determinar si hay un recurso disponible. Si es así, continúe con el resto de la función miembro. Si el recurso no está 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 CSingleLock se va a volver a usar o permita que se destruya el objeto CSingleLock.

Los objetos CSingleLock requieren la presencia de un objeto derivado de CSyncObject. Normalmente, es un miembro de datos de la clase del recurso controlado. Para obtener más información sobre cómo usar los objetos CSingleLock, vea el artículo Multithreading: Procedimientos para usar las clases de sincronización.

Jerarquía de herencia

CSingleLock

Requisitos

Encabezado: afxmt.h

CSingleLock::CSingleLock

Construye un objeto CSingleLock.

explicit CSingleLock(
    CSyncObject* pObject,
    BOOL bInitialLock = FALSE);

Parámetros

pObject
Apunta al objeto de sincronización al que se va a tener acceso. No puede ser NULL.

bInitialLock
Especifica si se intenta acceder inicialmente al objeto proporcionado.

Comentarios

Esta función se suele llamar desde dentro de una función miembro de acceso del recurso controlado.

Ejemplo

// m_CritSection is a data member (of type CCriticalSection)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_CritSection) with
// our CSingleLock object. 
CSingleLock singleLock(&m_CritSection);
singleLock.Lock();  // Attempt to lock the shared resource
if (singleLock.IsLocked())  // Resource has been locked
{
   //...use the shared resource...

   // Now that we are finished, 
   // unlock the resource for others.
   singleLock.Unlock();
}

CSingleLock::IsLocked

Determina si el objeto asociado al objeto CSingleLock no tiene signo (no disponible).

BOOL IsLocked();

Valor devuelto

Valor distinto de cero si el objeto está bloqueado; de lo contrario, 0.

Ejemplo

// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_Mutex) with
// our CSingleLock object. 
CSingleLock singleLock(&m_Mutex);

// Attempt to lock the shared resource
singleLock.Lock(100);    // Wait 100 ms...

// Has the resource been successfully locked?
if (singleLock.IsLocked())
{
   // We were able to lock the resource;
   // we may now work with the data associated with the mutex...

   // Now that we are finished, unlock the resource for others.
   singleLock.Unlock();
}

CSingleLock::Lock

Llame a esta función para acceder al recurso controlado por el objeto de sincronización suministrado por el constructor CSingleLock.

BOOL Lock(DWORD dwTimeOut = INFINITE);

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.

Valor devuelto

Distinto de cero si la función se realizó correctamente; de lo contrario, 0.

Comentarios

Si se señala al objeto de sincronización, Lock se devuelve correctamente y el subproceso ahora posee el objeto. Si el objeto de sincronización no está señalado (no disponible), Lock esperará el número de milisegundos especificados en el parámetro dwTimeOut a que el objeto de sincronización esté señalado. Si el objeto de sincronización no se ha señalado en la cantidad de tiempo especificada, Lock devuelve un error.

Ejemplo

// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_Mutex) with
// our CSingleLock object. 
CSingleLock singleLock(&m_Mutex);

// Attempt to lock the shared resource
if (singleLock.Lock(100))    // Wait 100 ms...
{
   // We were able to lock the resource;
   // we may now work with the data associated with the mutex...

   // Now that we are finished, unlock the resource for others.
   singleLock.Unlock();
}

CSingleLock::Unlock

Libera el objeto de sincronización propiedad de CSingleLock.

BOOL Unlock();

BOOL Unlock(
    LONG lCount,
    LPLONG lPrevCount = NULL);

Parámetros

lCount
Número de accesos que 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 recuento anterior.

Valor devuelto

Distinto de cero si la función se realizó correctamente; de lo contrario, 0.

Comentarios

El destructor de CSingleLock llama a esta función.

Si necesita liberar más de un recuento de accesos de un semáforo, use la segunda forma de Unlock y especifique el número de accesos que se van a liberar.

Ejemplo

// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_Mutex) with
// our CSingleLock object. 
CSingleLock singleLock(&m_Mutex);

// Attempt to lock the shared resource
if (singleLock.Lock(100))    // Wait 100 ms...
{
   // We were able to lock the resource;
   // we may now work with the data associated with the mutex...

   // Now that we are finished, unlock the resource for others.
   singleLock.Unlock();
}

Vea también

Gráfico de jerarquías
CMultiLock (clase)