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(ouWaitAsyncpara 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 chamaRelease).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();
}
}