Sobes.tech
Middle+

O que é um primitive de sincronização Semaphore?

sobes.tech IA

Resposta da IA

Semaphore — é um primitive de sincronização que controla o acesso a um conjunto limitado de recursos. Ele mantém um contador que determina quantos threads podem aceder simultaneamente ao recurso.

Operações principais:

  • WaitOne (ou WaitAsync para código assíncrono): Diminui o contador se for maior que zero. Se o contador for zero, o thread fica bloqueado até que o contador se torne positivo (outro thread chama Release).
  • Release: Incrementa o contador e pode desbloquear o thread à espera.

Tipos de Semaphore:

  • Semaphore: Sistema (com ou sem nome), pode ser usado entre processos.
  • SemaphoreSlim: Implementação leve, projetada para uso dentro de um processo. Preferível para sincronização intra-processo.

Exemplo de uso de SemaphoreSlim:

// semaphoreSlim pode ser usado para limitar o acesso simultâneo a um recurso
// Neste caso, é permitido 2 threads ao mesmo tempo
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Aguarda a liberação do semáforo
    await semaphoreSlim.WaitAsync();
    try
    {
        // Acesso ao recurso limitado
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} acessando recurso");
        await Task.Delay(1000); // Simulação de trabalho com o recurso
    }
    finally
    {
        // Libera o semáforo
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} liberando recurso");
        semaphoreSlim.Release();
    }
}