Partilhar via


Semáforo e SemaphoreSlim

O System.Threading.Semaphore classe representa um nomeado (todo o sistema) ou o local de semáforo. É um wrapper estreito ao redor do objeto semáforo do Win32. Os semáforos Win32 estão contando semáforos, que podem ser usados para controlar o acesso a um pool de recursos.

O SemaphoreSlim classe representa um semáforo leve, rápido, que pode ser usado de espera em um único processo quando os tempos de espera são esperados muito curto. SemaphoreSlimbaseia-se tanto quanto possível em primitivos de sincronização fornecidos pelo common language runtime (CLR). No entanto, ele também fornece identificadores de espera ociosamente inicializados, baseado no kernel, conforme necessário para dar suporte a vários semáforos aguardando. SemaphoreSlimtambém suporta. que o uso de tokens de cancelamento, mas ele não oferece suporte chamada semáforos ou o uso de um identificador de espera para sincronização.

Gerenciando um recurso limitado

Segmentos Insira o semáforo chamando o WaitOne método, que é herdado do WaitHandle classe. Quando a chamada retorna, a contagem o semáforo é diminuída. Quando um thread solicita a entrada e a contagem é zero, os blocos de thread. Como o semáforo de lançamento de segmentos chamando o Semaphore.Release método, os threads bloqueados têm permissão para inserir. Não há nenhuma ordem garantida, como, por exemplo, first-in, First-out (FIFO) ou última-in, First-out (LIFO) para threads bloqueados inserir o semáforo.

Um segmento pode inserir várias vezes do semáforo chamando o WaitOne método repetidamente. Para liberar o semáforo, o thread pode qualquer chamada a Release() o mesmo número de vezes, de sobrecarga de método ou ligue para o Release(Int32) de sobrecarga de método e especificar o número de entradas a serem lançados.

Semáforos e a identidade do segmento

O Semaphore classe não impõe a identidade do segmento em chamadas para o WaitOne e Release métodos. Por exemplo, um cenário de uso comum para semáforos envolve um thread de produtor e consumidor thread, com um thread sempre incrementando a contagem de semáforo e o outro sempre decremento-lo.

É responsabilidade do programador para garantir que um segmento não liberar o semáforo muitas vezes. Por exemplo, suponha que um semáforo tem uma contagem máxima de dois e que o thread a e o thread b entram o semáforo. Se um erro de programação no segmento b faz com que ele chame Release duas vezes, as duas chamadas teve êxito. A contagem o semáforo está cheia e quando thread a finalmente chama Release, um SemaphoreFullException é lançada.

Nomeado semáforos

O sistema operacional Windows permite que os semáforos ter nomes. Um semáforo com nome é todo o sistema. Ou seja, uma vez criado o semáforo com nome, é visível para todos os threads em todos os processos. Assim, o semáforo com nome pode ser usado para sincronizar as atividades de processos, bem como os threads.

Você pode criar um Semaphore objeto que representa um semáforo de sistema nomeado usando um dos construtores que especifica um nome.

Observação

Como todo o sistema nomeados semáforos, é possível ter vários Semaphore objetos que representam o mesmo semáforo nomeado.Cada vez que você chama um construtor ou o Semaphore.OpenExisting método, uma nova Semaphore objeto é criado.Especificar o mesmo nome repetidamente cria vários objetos que representam um semáforo com o mesmo nome.

Tenha cuidado ao usar nomeados semáforos. Porque eles estão em todo o sistema, outro processo que usa o mesmo nome pode inserir o semáforo inesperadamente. O código malicioso executado no mesmo computador poderia usar isso como base de um ataque de negação de serviço.

Usar a segurança de controle de acesso para proteger um Semaphore o objeto que representa um semáforo com nome, preferencialmente, usando um construtor que especifica um System.Security.AccessControl.SemaphoreSecurity objeto. Você também pode aplicar a segurança de controle de acesso usando o Semaphore.SetAccessControl método, mas isso deixa uma janela de vulnerabilidade entre o momento em que o semáforo é criado e a hora em que ele está protegido. Proteger os semáforos com a segurança de controle de acesso ajuda a impedir ataques maliciosos, mas não resolve o problema de conflitos de nome não intencionais.

Consulte também

Referência

Semaphore

SemaphoreSlim

Outros recursos

Threading objetos e recursos