Classe CSemaphore
Um objeto da classe CSemaphore
representa um "semáforo", que é um objeto de sincronização que permite que um número limitado de threads em um ou mais processos acessem Manter uma contagem do número de threads que atualmente acessam um recurso especificado.
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 objeto CSemaphore
é o número de usuários adicionais permitidos. Quando a contagem atingir zero, todas as tentativas de usar o recurso controlado pelo objeto CSemaphore
serão inseridas em uma fila do sistema e aguardarão até que elas atinjam o tempo limite ou a contagem aumente 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. Chame 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 dados CSemaphore
especificando a contagem de acesso inicial, a contagem máxima de acesso, o nome do semáforo (se ele será 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 foi 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 objeto CSemaphore
, crie um objeto CMultiLock ou CSingleLock e chame suas funções de membro Bloquear e Desbloquear.
Importante
Depois de criar objeto CSemaphore
, 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.