Partilhar via


Classe CSemaphore

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.

Observações

Os semáforos são úteis para controlar o acesso a um recurso compartilhado que só pode suportar um número limitado de usuários. A contagem atual do objeto é o CSemaphore número de outros usuários permitidos. Quando a contagem atinge zero, todas as tentativas de usar o recurso controlado pelo objeto são inseridas em uma fila do CSemaphore sistema e aguardam até que 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 de uma só vez é especificado durante a CSemaphore construção do objeto.

Para usar um CSemaphore objeto, construa o CSemaphore objeto 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 retorna. Ligue CSyncObject::Unlock quando terminar de acessar o recurso controlado.

Um método alternativo para usar CSemaphore objetos é adicionar uma variável do tipo CSemaphore como um membro de dados à classe que você deseja controlar. Durante a construção do objeto controlado, chame o CSemaphore construtor do membro de dados especificando a contagem de acesso inicial, a contagem máxima de acesso, o nome do semáforo (se ele for usado através dos limites do processo) e os atributos de segurança desejados.

Para acessar recursos controlados por CSemaphore objetos dessa maneira, primeiro crie uma variável do tipo CSingleLock ou digite CMultiLock na função de membro de acesso do seu recurso. Em seguida, chame a função de membro do Lock objeto lock (por exemplo, CSingleLock::Lock). Neste ponto, seu thread obterá acesso ao recurso, aguardará que o recurso seja liberado e obtenha acesso, ou aguardará que o recurso seja liberado e atinja o tempo limite, não conseguindo obter acesso ao recurso. Em qualquer caso, seu recurso é acessado de maneira segura para threads. Para liberar o recurso, use a função de membro do Unlock objeto lock (por exemplo, CSingleLock::Unlock) ou permita que o objeto lock saia do escopo.

Como alternativa, você pode criar um CSemaphore objeto autônomo e acessá-lo explicitamente antes de tentar acessar o recurso controlado. Esse método, embora mais claro para alguém que lê seu código-fonte, é mais propenso a erros.

Para obter mais informações sobre como usar CSemaphore objetos, consulte o artigo Multithreading: Como usar as classes de sincronização.

Hierarquia de herança

CObject

CSyncObject

CSemaphore

Requerimentos

Cabeçalho: afxmt.h

CSemaphore::CSemaphore

Constrói um objeto nomeado ou não nomeado CSemaphore .

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 ou igual a 0 e menor ou igual a lMaxCount.

lMaxCount
A contagem máxima de uso para o semáforo. Deve ser maior que 0.

pstrName
O nome do semáforo. Deve ser fornecido se o semáforo for acessado através dos limites do processo. Se NULL, o objeto não será nomeado. Se o nome corresponder a um semáforo existente, o construtor constrói um novo CSemaphore objeto que faz referência ao semáforo desse nome. Se o nome corresponder a um objeto de sincronização existente que não seja um semáforo, a construção falhará.

lpsaAttributes
Atributos de segurança para o objeto semáforo. Para obter uma descrição completa dessa estrutura, consulte SECURITY_ATTRIBUTES no SDK do Windows.

Observações

Para acessar ou liberar um CSemaphore objeto, crie um CMultiLock ou CSingleLock objeto e chame suas Lock funções e Desbloquear membro.

Importante

Depois de criar o CSemaphore objeto, use GetLastError para garantir que o mutex ainda não existia. Se o mutex existiu inesperadamente, isso pode indicar que um processo fraudulento está agachado e pode estar pretendendo usar o mutex maliciosamente. Neste caso, o procedimento recomendado com consciência de segurança é fechar a alça e continuar como se houvesse uma falha na criação do objeto.

Ver também

CSyncObject Classe
Gráfico de Hierarquia