Sobes.tech
Junior — Middle

Explica qué es un semáforo y cómo se utiliza para gestionar la sincronización de hilos.

sobes.tech AI

Respuesta de la IA

Un semáforo es un primitive de sincronización que se utiliza para gestionar el acceso a un recurso compartido por varios hilos.

Contiene un contador que indica cuántos hilos pueden acceder al recurso simultáneamente.

  • Si el contador es mayor que cero, el hilo puede entrar y disminuir el contador en 1.
  • Si el contador es cero, el hilo se bloquea y espera a que otro hilo libere el recurso.

En C#, el semáforo se representa mediante la clase Semaphore o SemaphoreSlim.

Ejemplo de uso de SemaphoreSlim:

using System;
using System.Threading;

class Program
{
    static SemaphoreSlim semaphore = new SemaphoreSlim(2); // máximo 2 hilos simultáneamente

    static void AccessResource(int id)
    {
        Console.WriteLine($"Hilo {id} espera acceso");
        semaphore.Wait(); // solicitud de acceso
        Console.WriteLine($"Hilo {id} obtuvo acceso");

        Thread.Sleep(1000); // simulación de 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();
        }
    }
}

En este ejemplo, no más de dos hilos pueden trabajar con el recurso al mismo tiempo, los demás esperan su turno.