Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
A biblioteca Microsoft Foundation Classes (MFC) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.
Representa o mecanismo de controlo de acesso usado no controlo do acesso a recursos num programa multithread.
Sintaxe
class CMultiLock
Membros
Construtores Públicos
| Nome | Description |
|---|---|
| CMultiLock::CMultiLock | Constrói um CMultiLock objeto. |
Métodos Públicos
| Nome | Description |
|---|---|
| CMultiLock::IsLocked | Determina se um objeto específico de sincronização no array está bloqueado. |
| CMultiLock::Lock | Fica à espera do array de objetos de sincronização. |
| CMultiLock::Unlock | Liberta quaisquer objetos de sincronização próprios. |
Observações
CMultiLock não tem uma classe base.
Para usar as classes de sincronização CSemaphore, CMutex e CEvent, pode criar um CMultiLock objeto ou CSingleLock para esperar e libertar o objeto de sincronização. Use CMultiLock quando houver vários objetos que possa usar ao mesmo tempo. Usa CSingleLock quando só precisas de esperar por um objeto de cada vez.
Para usar um CMultiLock objeto, crie primeiro um array dos objetos de sincronização que deseja esperar. De seguida, chama o CMultiLock construtor do objeto dentro de uma função membro na classe do recurso controlado. Depois, chame a função membro Lock para determinar se um recurso está disponível (sinalizado). Se houver, continue com o restante da função de membro. Se não houver recurso disponível, espere um tempo especificado para que um recurso seja libertado, ou devolve a falha. Após a utilização de um recurso estar concluída, pode chamar a função de Desbloqueio se o CMultiLock objeto for usado novamente, ou permitir que o CMultiLock objeto seja destruído.
CMultiLock Os objetos são mais úteis quando um thread tem um grande número de CEvent objetos aos quais pode responder. Crie um array contendo todos os CEvent ponteiros e chame Lock. Isto fará com que o tópico espere até que um dos eventos seja sinalizado.
Para mais informações sobre como usar CMultiLock objetos, consulte o artigo Multithreading: Como Usar as Classes de Sincronização.
Hierarquia de herança
CMultiLock
Requerimentos
Cabeçalho: afxmt.h
CMultiLock::CMultiLock
Constrói um CMultiLock objeto.
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
Parâmetros
ppObjects
Array de ponteiros para os objetos de sincronização a serem aguardados. Não pode ser NULL.
dwCount
Número de objetos em ppObjects. Deve ser maior que 0.
bInitialLock
Especifica se deve tentar inicialmente aceder a algum dos objetos fornecidos.
Observações
Esta função é chamada após criar o array de objetos de sincronização a serem aguardados. Normalmente é chamada a partir do thread que deve esperar que um dos objetos de sincronização fique disponível.
CMultiLock::IsLocked
Determina se o objeto especificado não está sinalizado (indisponível).
BOOL IsLocked(DWORD dwItem);
Parâmetros
dwItem
O índice no array de objetos correspondente ao objeto cujo estado está a ser consultado.
Valor de retorno
Não nulo se o objeto especificado estiver bloqueado; caso contrário, 0.
CMultiLock::Lock
Chame esta função para aceder a um ou mais dos recursos controlados pelos objetos de sincronização fornecidos ao CMultiLock construtor.
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 for INFINITO, Lock esperará até que o objeto seja sinalizado antes de regressar.
bWaitForAll
Especifica se todos os objetos aguardados devem ser sinalizados ao mesmo tempo antes de regressar. Se for FALSE, Lock devolve quando qualquer um dos objetos em espera for sinalizado.
dwWakeMask
Especifica outras condições que permitem abortar a espera. Para uma lista completa das opções disponíveis para este parâmetro, veja MsgWaitForMultipleObjects no SDK do Windows.
Valor de retorno
Se Lock falhar, retorna - 1. Se for bem-sucedido, devolve um dos seguintes valores:
Entre WAIT_OBJECT_0 e WAIT_OBJECT_0 + (número de objetos - 1)
Se o bWaitForAll for TRUE, todos os objetos são sinalizados (disponíveis). Se bWaitForAll for FALSE, o valor de retorno - WAIT_OBJECT_0 é o índice no array de objetos do objeto que é 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 são sinalizados, e pelo menos um dos objetos é um objeto mutex abandonado. Se bWaitForAll for FALSE, o valor de retorno - WAIT_ABANDONED_0 é o índice no array de objetos do objeto mutex abandonado que satisfez a espera.
WAIT_TIMEOUT
O intervalo de tempo especificado em dwTimeOut expirou sem que a espera tivesse sucesso.
Observações
Se o bWaitForAll for TRUE, Lock retornará com sucesso assim que todos os objetos de sincronização forem sinalizados simultaneamente. Se o bWaitForAll for FALSE, Lock retornará assim que um ou mais dos objetos de sincronização forem sinalizados.
Se Lock não conseguir regressar imediatamente, aguardará no máximo o número de milissegundos especificados no parâmetro dwTimeOut antes de regressar. Se dwTimeOut for INFINITO, Lock não retornará até que o acesso a um objeto seja obtido ou uma condição especificada em dwWakeMask seja cumprida. Caso contrário, se Lock conseguir adquirir um objeto de sincronização, este retornará com sucesso; caso contrário, retornará falha.
CMultiLock::Unlock
Liberta o objeto de sincronização pertencente a CMultiLock.
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Parâmetros
Conde
Número de referências a divulgar. Deve ser maior que 0. Se a quantidade especificada fizer com que a contagem do objeto excedesse o seu máximo, a contagem não é alterada e a função devolve FALSE.
LPrevCount
Aponta para uma variável que recebe a contagem anterior do objeto de sincronização. Se for NULL, a contagem anterior não é devolvida.
Valor de retorno
Não nula se a função fosse bem-sucedida; caso contrário, 0.
Observações
Esta função é chamada por CMultiLock's destruidor.
A primeira forma de Unlock tenta desbloquear o objeto de sincronização gerido por CMultiLock. A segunda forma de Unlock tenta desbloquear os CSemaphore objetos pertencentes a CMultiLock. Se CMultiLock não possuir nenhum objeto bloqueado CSemaphore , a função devolve FALSE; caso contrário, devolve TRUE.
lCount e lpPrevCount são exatamente os mesmos parâmetros do CSingleLock::Unlock. A segunda forma de Unlock raramente é aplicável a situações de multibloqueio.