Sobes.tech
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 (ou WaitOne em 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.