Sobes.tech
Middle

¿En qué se diferencian mutex y semáforo de lock?

sobes.tech AI

Respuesta de la IA

lock en C# es un azúcar sintáctico para usar Monitor.Enter y Monitor.Exit, envueltos en un bloque try-finally para garantizar la liberación del bloqueo. Proporciona acceso exclusivo a un recurso para un solo hilo. Es, en esencia, el primitivo de sincronización más simple a nivel de objeto.

Mutex (mutex) es un primitivo de sincronización que puede usarse para proporcionar acceso exclusivo a un recurso para un solo hilo de múltiples procesos. Tiene un concepto de propiedad del hilo: solo el hilo que obtiene el mutex puede liberarlo.

Semaphore (semaforo) es un primitivo de sincronización que limita la cantidad de hilos que pueden acceder a un recurso simultáneamente. Tiene un contador que disminuye al obtener acceso y aumenta al liberarlo.

Las diferencias principales se presentan en la tabla:

Característica lock (Monitor) Mutex Semaphore
Ámbito de visibilidad Dentro de un proceso Entre procesos Entre procesos
Número de hilos Solo uno Solo uno (propietario) Número limitado
Propiedad Vinculado al hilo Vinculado al hilo No vinculado a hilo
Uso Sincronización simple Sincronización entre procesos, mutexes con nombre Limitación del acceso paralelo a un recurso
Excepciones No requiere manejo explícito de AbandonedMutexException Requiere manejo de AbandonedMutexException No hay AbandonedSemaphoreException
// Ejemplo de uso de lock
private readonly object _lockObject = new object();

public void DoSomethingWithLock()
{
    lock (_lockObject)
    {
        // Sección crítica
    }
}

// Ejemplo de uso de Mutex
using System.Threading;

private Mutex _mutex = new Mutex();

public void DoSomethingWithMutex()
{
    _mutex.WaitOne(); // Obtener el mutex
    try
    {
        // Sección crítica
    }
    finally
    {
        _mutex.ReleaseMutex(); // Liberar el mutex
    }
}

// Ejemplo de uso de Semaphore
using System.Threading;

private Semaphore _semaphore = new Semaphore(3, 3); // Permite 3 hilos simultáneamente

public void DoSomethingWithSemaphore()
{
    _semaphore.WaitOne(); // Obtener "acceso" al semáforo
    try
    {
        // Sección crítica, acceso limitado a 3 hilos
    }
    finally
    {
        _semaphore.Release(); // Liberar "acceso"
    }
}