¿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"
}
}