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