Sobes.tech
Middle

¿Cuál es la diferencia entre un semáforo y un mutex?

sobes.tech AI

Respuesta de la IA

El mutex (Mutex, Exclusión Mutua) es un mecanismo de sincronización que garantiza que en un momento dado solo un hilo tenga acceso a la sección crítica del código o recurso. Funciona bajo el principio de propiedad: el hilo que bloquea el mutex debe liberarlo.

El semáforo (Semaphore) es un mecanismo de sincronización más general que controla el acceso a un recurso limitado por una cierta cantidad de "permiso". Los hilos pueden obtener permiso si está disponible y continuar con la ejecución. Cuando el recurso ya no es necesario, el permiso se devuelve. El semáforo no tiene concepto de propiedad; cualquier hilo puede incrementar el contador del semáforo.

Diferencias clave:

  • Propósito: El mutex se usa para acceso exclusivo (un hilo), el semáforo para gestionar el acceso a un grupo limitado de recursos (varios hilos hasta el límite).
  • Propiedad: El mutex tiene un propietario (el hilo que lo bloqueó). El semáforo no tiene propietario.
  • Contador: El mutex puede considerarse como un semáforo con contador igual a 1. El semáforo puede tener un contador mayor a 1.
  • Operaciones: Mutex: WaitOne/Pulse/ReleaseMutex. Semáforo: WaitOne/Release.

Aquí hay un ejemplo simple de uso de semáforo en C#:

// Crear un semáforo con valor inicial 2 y máximo 2.
// Permite que hasta 2 hilos accedan al recurso simultáneamente.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);

// El hilo intenta acceder al recurso
semaphore.WaitOne();
// ... trabajo con el recurso ...
semaphore.Release(); // Liberar permiso

Ejemplo de mutex:

// Crear un mutex
Mutex mutex = new Mutex();

// El hilo intenta obtener acceso exclusivo
mutex.WaitOne();
// ... trabajo con la sección crítica ...
mutex.ReleaseMutex(); // Liberar el mutex (solo el propietario puede)