Sobes.tech
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.