Junior — Middle
Explique o que é um semáforo e como ele é utilizado para gerir a sincronização de threads.
sobes.tech IA
Resposta da IA
Um semáforo é uma primitive de sincronização usada para controlar o acesso a um recurso compartilhado por vários threads.
Ele contém um contador que indica quantos threads podem aceder ao recurso simultaneamente.
- Se o contador for maior que zero, o thread pode entrar e diminuir o contador em 1.
- Se o contador for zero, o thread fica bloqueado e espera que outro thread libere o recurso.
Em C#, o semáforo é representado pela classe Semaphore ou SemaphoreSlim.
Exemplo de uso de SemaphoreSlim:
using System;
using System.Threading;
class Program
{
static SemaphoreSlim semaphore = new SemaphoreSlim(2); // máximo de 2 threads ao mesmo tempo
static void AccessResource(int id)
{
Console.WriteLine($"Thread {id} espera acesso");
semaphore.Wait(); // pedido de acesso
Console.WriteLine($"Thread {id} obteve acesso");
Thread.Sleep(1000); // simulação de trabalho com o recurso
Console.WriteLine($"Thread {id} liberta o recurso");
semaphore.Release(); // libertação do recurso
}
static void Main()
{
for (int i = 1; i <= 5; i++)
{
int localId = i;
new Thread(() => AccessResource(localId)).Start();
}
}
}
Neste exemplo, no máximo dois threads podem trabalhar com o recurso ao mesmo tempo, os restantes aguardam a sua vez.