Sobes.tech
Middle+

¿Qué es un primitivo de sincronización Semaphore?

sobes.tech AI

Respuesta de la IA

Semaphore — es un primitivo de sincronización que controla el acceso a un conjunto limitado de recursos. Mantiene un contador que determina cuántos hilos pueden acceder simultáneamente al recurso.

Operaciones principales:

  • WaitOne (o WaitAsync para código asíncrono): Disminuye el contador si es mayor que cero. Si el contador es cero, el hilo se bloquea hasta que el contador sea positivo (otro hilo llama a Release).
  • Release: Incrementa el contador y puede desbloquear al hilo en espera.

Tipos de Semaphore:

  • Semaphore: Sistema (con nombre o sin nombre), puede usarse entre procesos.
  • SemaphoreSlim: Implementación ligera, diseñada para usarse dentro de un proceso. Preferible para sincronización intra-proceso.

Ejemplo de uso de SemaphoreSlim:

// semaphoreSlim puede usarse para limitar el acceso simultáneo a un recurso
// En este caso, se permite 2 hilos a la vez
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Espera a que se libere el semáforo
    await semaphoreSlim.WaitAsync();
    try
    {
        // Acceso a recurso limitado
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} accediendo al recurso");
        await Task.Delay(1000); // Simulación de trabajo con el recurso
    }
    finally
    {
        // Libera el semáforo
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} liberando el recurso");
        semaphoreSlim.Release();
    }
}