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(oWaitOneen 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.