Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um objeto de classe CSemaphore representa um "semáforo". Um semáforo é um objeto de sincronização que controla o acesso a recursos compartilhados e impede condições de corrida.
Sintaxe
class CSemaphore : public CSyncObject
Membros
Construtores públicos
| Nome | Descrição |
|---|---|
CSemaphore::CSemaphore |
Constrói um objeto CSemaphore. |
Comentários
Semáforos são úteis para controlar o acesso a um recurso compartilhado que só pode dar suporte a um número limitado de usuários. A contagem atual do CSemaphore objeto é o número de outros usuários permitidos. Quando a contagem atinge zero, todas as tentativas de usar o recurso controlado pelo CSemaphore objeto são inseridas em uma fila do sistema e esperam até que elas atinjam o tempo limite ou a contagem suba acima de 0. O número máximo de usuários que podem acessar o recurso controlado ao mesmo tempo é especificado durante a construção do objeto CSemaphore.
Para usar um objeto CSemaphore, construa o objeto CSemaphore quando for necessário. Especifique o nome do semáforo que você deseja aguardar e que seu aplicativo deve inicialmente possuí-lo. Em seguida, você pode acessar o semáforo quando o construtor retornar. Ligue CSyncObject::Unlock quando terminar de acessar o recurso controlado.
Um método alternativo para usar objetos CSemaphore é adicionar uma variável de tipo CSemaphore como um membro de dados à classe que você deseja controlar. Durante a construção do objeto controlado, chame o construtor do membro de CSemaphore dados especificando a contagem de acesso inicial, a contagem máxima de acesso, o nome do semáforo (se ele for usado entre os limites do processo) e os atributos de segurança desejados.
Para acessar recursos controlados por objetos CSemaphore dessa maneira, primeiro crie uma variável do tipo CSingleLock ou do tipo CMultiLock na função de membro de acesso do recurso. Em seguida, chame a função do membro Lock do objeto de bloqueio (por exemplo, CSingleLock::Lock). Neste ponto, o thread terá acesso ao recurso, aguardará a liberação do recurso e obterá acesso ou aguardará o recurso ser liberado e o tempo limite, não obtendo acesso ao recurso. De qualquer forma, seu recurso é acessado de maneira thread-safe. Para liberar o recurso, use a função do membro Unlock do objeto de bloqueio (por exemplo, CSingleLock::Unlock) ou permita que o objeto de bloqueio fique fora do escopo.
Como alternativa, você pode criar um objeto CSemaphore autônomo e acessá-lo explicitamente antes de tentar acessar o recurso controlado. Esse método, embora mais claro para alguém que está lendo seu código-fonte, é mais propenso a erros.
Para obter mais informações sobre como usar objetos CSemaphore, consulte o artigo Multithreading: como usar as classes de sincronização.
Hierarquia de herança
CSemaphore
Requisitos
Cabeçalho: afxmt.h
CSemaphore::CSemaphore
Constrói um objeto CSemaphore nomeado ou sem nome.
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
Parâmetros
lInitialCount
A contagem de uso inicial para o semáforo. Deve ser maior que ou igual a 0 e menor que ou igual a lMaxCount.
lMaxCount
A contagem de uso máximo para o semáforo. Deve ser maior que 0.
pstrName
O nome do semáforo. Deve ser fornecido se o semáforo for acessado entre os limites do processo. Se NULL, o objeto não terá nome. Se o nome corresponder a um semáforo existente, o construtor criará um novo objeto CSemaphore que referencie o semáforo desse nome. Se o nome corresponder a um objeto de sincronização existente que não é um semáforo, a construção falhará.
lpsaAttributes
Atributos de segurança para o objeto de semáforo. Para obter uma descrição completa dessa estrutura, consulte SECURITY_ATTRIBUTES no SDK do Windows.
Comentários
Para acessar ou liberar um CSemaphore objeto, crie um CMultiLock objeto ou CSingleLock um objeto e chame suas Lock funções de membro e Desbloqueie .
Importante
Depois de criar o CSemaphore objeto, use GetLastError para garantir que o mutex ainda não exista. Se o mutex existiu inesperadamente, isso pode indicar que um processo desonesto está em squatting e pode estar pretendendo usar o mutex maliciosamente. Nesse caso, o procedimento recomendado consciente da segurança é fechar o identificador e continuar como se houvesse uma falha na criação do objeto.