Compartilhar via


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

CObject

CSyncObject

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.

Confira também

Classe CSyncObject
Gráfico da hierarquia