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.

Confira também

Gráfico da hierarquia