Junior — Middle
Pode explicar o que é um semáforo e como ele é usado para controlar o acesso aos recursos?
sobes.tech IA
Resposta da IA
Um semáforo é um mecanismo de sincronização utilizado para controlar o acesso a um recurso compartilhado em aplicações multithread. Ele contém um contador que indica quantos threads podem aceder ao recurso simultaneamente.
Princípio de funcionamento:
- Inicialmente, o contador é definido para o número de recursos disponíveis (por exemplo, 3).
- Quando um thread deseja aceder, ele chama a operação
Wait(ouWaitOneem C#), que diminui o contador em 1. - Se o contador ficar menor que zero, o thread fica bloqueado e espera até que o recurso seja liberado.
- Quando um thread liberta o recurso, chama
Release, aumentando o contador e desbloqueando os threads em espera.
Exemplo em C#:
using System;
using System.Threading;
class Program
{
static Semaphore semaphore = new Semaphore(3, 3); // máximo de 3 threads simultaneamente
static void AccessResource(int id)
{
Console.WriteLine($"Thread {id} espera acesso");
semaphore.WaitOne(); // pedido de acesso
Console.WriteLine($"Thread {id} obteve acesso");
Thread.Sleep(1000); // 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();
}
}
}
Desta forma, o semáforo limita o número de threads que trabalham simultaneamente com o recurso, prevenindo condições de corrida e garantindo a operação correta.