Sobes.tech
Junior — Middle

¿Puedes explicar qué es un semáforo y cómo se usa para controlar el acceso a los recursos?

sobes.tech AI

Respuesta de la IA

Un semáforo es un mecanismo de sincronización que se utiliza para controlar el acceso a un recurso compartido en aplicaciones multihilo. Contiene un contador que indica cuántos hilos pueden acceder al recurso simultáneamente.

Principio de funcionamiento:

  • Inicialmente, el contador se establece en el número de recursos disponibles (por ejemplo, 3).
  • Cuando un hilo desea acceder, llama a la operación Wait (o WaitOne en C#), que disminuye el contador en 1.
  • Si el contador se vuelve menor que cero, el hilo se bloquea y espera hasta que el recurso se libere.
  • Cuando un hilo libera el recurso, llama a Release, incrementando el contador y desbloqueando los hilos en espera.

Ejemplo en C#:

using System;
using System.Threading;

class Program
{
    static Semaphore semaphore = new Semaphore(3, 3); // máximo 3 hilos simultáneamente

    static void AccessResource(int id)
    {
        Console.WriteLine($"Hilo {id} espera acceso");
        semaphore.WaitOne(); // solicitud de acceso
        Console.WriteLine($"Hilo {id} obtuvo acceso");
        Thread.Sleep(1000); // trabajo con el recurso
        Console.WriteLine($"Hilo {id} libera el recurso");
        semaphore.Release(); // liberación del recurso
    }

    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            int localId = i;
            new Thread(() => AccessResource(localId)).Start();
        }
    }
}

De esta manera, el semáforo limita la cantidad de hilos que trabajan simultáneamente con el recurso, previniendo condiciones de carrera y asegurando la correcta operación.