Compartilhar via


Classe CSingleLock

Representa o mecanismo de controle de acesso usado para controlar o acesso a um recurso em um programa multithread.

Sintaxe

class CSingleLock

Membros

Construtores públicos

Nome Descrição
CSingleLock::CSingleLock Constrói um objeto CSingleLock.

Métodos públicos

Nome Descrição
CSingleLock::IsLocked Determina se o objeto está bloqueado.
CSingleLock::Lock Aguarda um objeto de sincronização.
CSingleLock::Unlock Libera um objeto de sincronização.

Comentários

CSingleLock não tem uma classe base.

Para usar as classes de sincronização CSemaphore, CMutex, CCriticalSection e CEvent, você deve criar um objeto CSingleLock ou CMultiLock para aguardar e liberar o objeto de sincronização. Use CSingleLock quando precisar apenas aguardar um objeto de cada vez. Use CMultiLock quando houver vários objetos que você poderia usar em um determinado momento.

Para usar um objeto CSingleLock, chame seu construtor dentro de uma função membro na classe do recurso controlado. Em seguida, chame a função membro IsLocked para determinar se o recurso está disponível. Se estiver, continue com o restante da função membro. Se o recurso estiver indisponível, aguarde um período especificado para que ele seja liberado ou retorne uma falha. Depois que o uso do recurso for concluído, chame a função Unlock se o objeto CSingleLock deve ser usado novamente ou permita que o objeto CSingleLock seja destruído.

Objetos CSingleLock exigem a presença de um objeto derivado de CSyncObject. Geralmente, esse é um membro de dados da classe do recurso controlado. Para obter mais informações sobre como usar objetos CSingleLock, consulte o artigo Multithreading: como usar as classes de sincronização.

Hierarquia de herança

CSingleLock

Requisitos

Cabeçalho: afxmt.h

CSingleLock::CSingleLock

Constrói um objeto CSingleLock.

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

Parâmetros

pObject
Aponta para o objeto de sincronização a ser acessado. Não pode ser NULL.

bInitialLock
Especifica se é necessário tentar acessar inicialmente o objeto fornecido.

Comentários

Essa função geralmente é chamada de dentro de uma função membro de acesso do recurso controlado.

Exemplo

// 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 se o objeto associado ao objeto CSingleLock é não sinalizado (indisponível).

BOOL IsLocked();

Valor de retorno

Diferente de zero se o objeto estiver bloqueado; caso contrário, 0.

Exemplo

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

Chame essa função para obter acesso ao recurso controlado pelo objeto de sincronização fornecido ao construtor CSingleLock.

BOOL Lock(DWORD dwTimeOut = INFINITE);

Parâmetros

dwTimeOut
Especifica o tempo de espera para que o objeto de sincronização esteja disponível (sinalizado). Se INFINITE, Lock aguardará até que o objeto seja sinalizado antes de retornar.

Valor de retorno

Diferente de zero se a função foi bem-sucedida, caso contrário, 0.

Comentários

Se o objeto de sincronização for sinalizado, Lock retornará com êxito e o thread agora será o proprietário do objeto. Se o objeto de sincronização não estiver sinalizado (indisponível), Lock aguardará até que ele seja sinalizado até o número de milissegundos especificado no parâmetro dwTimeOut. Se o objeto de sincronização não foi sinalizado no período especificado, Lock retorna a falha.

Exemplo

// 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 o objeto de sincronização de propriedade de CSingleLock.

BOOL Unlock();

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

Parâmetros

lCount
Número de acessos a serem liberados. Deve ser maior que 0. Se a quantidade especificada fizer com que a contagem do objeto exceda o máximo, a contagem não será alterada e a função retornará FALSE.

lPrevCount
Aponta para uma variável para receber a contagem anterior do objeto de sincronização. Se NULL, a contagem anterior não será retornada.

Valor de retorno

Diferente de zero se a função foi bem-sucedida, caso contrário, 0.

Comentários

Essa função é chamada pelo destruidor de CSingleLock.

Se você precisar liberar mais de uma contagem de acesso de um semáforo, use o segundo formulário de Unlock e especifique o número de acessos a serem liberados.

Exemplo

// 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();
}

Confira também

Gráfico da hierarquia
Classe CMultiLock