Classe CMultiLock
Representa o mecanismo de controle de acesso usado para controlar o acesso a recursos em um programa multithread.
Sintaxe
class CMultiLock
Membros
Construtores públicos
Nome | Descrição |
---|---|
CMultiLock::CMultiLock | Constrói um objeto CMultiLock . |
Métodos públicos
Nome | Descrição |
---|---|
CMultiLock::IsLocked | Determina se um objeto de sincronização específico na matriz está bloqueado. |
CMultiLock::Lock | Aguarda a matriz de objetos de sincronização. |
CMultiLock::Unlock | Libera qualquer objeto de sincronização de propriedade. |
Comentários
CMultiLock
não tem uma classe base.
Para usar as classes de sincronização CSemaphore, CMutex e CEvent, você pode criar um objeto CSingleLock ou um CMultiLock
objeto CSingleLock para aguardar e liberar o objeto de sincronização. Use CMultiLock
quando houver vários objetos que você poderia usar em um determinado momento. Use CSingleLock
quando precisar apenas aguardar um objeto de cada vez.
Para usar um objeto CMultiLock
, primeiro crie uma matriz dos objetos de sincronização que você deseja aguardar. Em seguida, chame o construtor do objeto CMultiLock
dentro de uma função membro na classe do recurso controlado. Então chame a função de membro Lock para determinar se um recurso está disponível (sinalizado). Se um for, continue com o restante da função membro. Se nenhum recurso estiver disponível, aguarde um período especificado para que um recurso seja liberado ou retorne uma falha. Depois que o uso de um recurso for concluído, chame a função Desbloquear se o objeto CMultiLock
deve ser usado novamente ou permita que o objeto CMultiLock
seja destruído.
Os objetos CMultiLock
são mais úteis quando um thread tem um grande número de objetos CEvent
aos quais pode responder. Crie uma matriz contendo todos os ponteiros CEvent
e chame Lock
. Isso fará com que o thread aguarde até que um dos eventos seja sinalizado.
Para obter mais informações sobre como usar objetos CMultiLock
, consulte o artigo Multithreading: como usar as classes de sincronização.
Hierarquia de herança
CMultiLock
Requisitos
Cabeçalho: afxmt.h
CMultiLock::CMultiLock
Constrói um objeto CMultiLock
.
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
Parâmetros
ppObjects
Matriz de ponteiros para os objetos de sincronização a serem aguardados. Não pode ser NULL.
dwCount
O número de objetos em ppObjects. Deve ser maior que 0.
bInitialLock
Especifica se é necessário tentar acessar inicialmente qualquer um dos objetos fornecidos.
Comentários
Essa função é chamada depois de criar a matriz de objetos de sincronização a serem aguardados. Geralmente, é chamada de dentro do thread que deve aguardar a disponibilidade de um dos objetos de sincronização.
CMultiLock::IsLocked
Determina se o objeto especificado não está atribuído (indisponível).
BOOL IsLocked(DWORD dwItem);
Parâmetros
dwItem
O índice na matriz de objetos correspondentes ao objeto cujo estado está sendo consultado.
Valor de retorno
Não zero se o objeto especificado estiver bloqueado; caso contrário, 0.
CMultiLock::Lock
Chame essa função para obter acesso a um ou mais dos recursos controlados pelos objetos de sincronização fornecidos ao construtor CMultiLock
.
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
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.
bWaitForAll
Especifica se todos os objetos esperados devem ser sinalizados ao mesmo tempo antes de retornar. Se FALSE, Lock
retornará quando qualquer um dos objetos aguardados for sinalizado.
dwWakeMask
Especifica outras condições que têm permissão para anular a espera. Para uma lista completa das opções disponíveis para esse parâmetro, confira MsgWaitForMultipleObjects no SDK do Windows.
Valor de retorno
Se Lock
falhar, ele retornará - 1. Se tiver êxito, ele retornará um dos seguintes valores:
Entre WAIT_OBJECT_0 e WAIT_OBJECT_0 + (número de objetos - 1)
Se bWaitForAll for TRUE, todos os objetos serão sinalizados (disponíveis). Se bWaitForAll for FALSE, o valor retornado – WAIT_OBJECT_0 será o índice na matriz de objetos do objeto que está sinalizado (disponível).
WAIT_OBJECT_0 + (número de objetos)
Um evento especificado em dwWakeMask está disponível na fila de entrada do thread.
Entre WAIT_ABANDONED_0 e WAIT_ABANDONED_0 + (número de objetos - 1)
Se bWaitForAll for TRUE, todos os objetos serão sinalizados e pelo menos um dos objetos será um objeto mutex abandonado. Se bWaitForAll for FALSE, o valor retornado - WAIT_ABANDONED_0 será o índice na matriz de objetos do objeto mutex abandonado que satisfaz a espera.
WAIT_TIMEOUT
O intervalo de tempo limite especificado no dwTimeOut expirou sem a espera ter êxito.
Comentários
Se bWaitForAll for TRUE, Lock
retornará com êxito assim que todos os objetos de sincronização forem sinalizados simultaneamente. Se bWaitForAll for FALSE, Lock
retornará assim que um ou mais objetos de sincronização forem sinalizados.
Se Lock
não for capaz de retornar imediatamente, ele aguardará não mais do que o número de milissegundos especificado no parâmetro dwTimeOut antes de retornar. Se dwTimeOut for INFINITE, Lock
não retornará até que o acesso a um objeto seja obtido ou uma condição especificada em dwWakeMask seja atendida. Caso contrário, se Lock
puder adquirir um objeto de sincronização, ele retornará com êxito; se não, retornará a falha.
CMultiLock::Unlock
Libera o objeto de sincronização de propriedade de CMultiLock
.
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Parâmetros
lCount
Número de contagens de referência a serem lançadas. Deve ser maior que 0. Se a quantidade especificada fizer com que a contagem do objeto exceda seu 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 CMultiLock
.
A primeira forma de Unlock
tenta desbloquear o objeto de sincronização gerenciado por CMultiLock
. A segunda forma de Unlock
tenta desbloquear os objetos CSemaphore
pertencentes a CMultiLock
. Se CMultiLock
não tiver nenhum objeto bloqueado CSemaphore
, a função retornará FALSE; caso contrário, retornará TRUE. LCount e lpPrevCount são exatamente os mesmos que os parâmetros de CSingleLock::Unlock. A segunda forma de Unlock
raramente é aplicável a situações de bloqueio múltiplo.