Sobes.tech
Junior

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

sobes.tech AI

Respuesta de la IA

El mutex es un semáforo binario que está libre (valor 1) o ocupado (valor 0). Se usa para proteger secciones críticas y garantiza acceso excluyente a un recurso. Solo el hilo que ha adquirido el mutex puede liberarlo.

El semáforo es una generalización del mutex, que representa un contador. Puede tomar valores no negativos y se usa para gestionar el acceso a una cantidad limitada de recursos. Un hilo puede adquirir un semáforo si el contador es mayor que cero (reduciéndolo), y liberarlo (aumentando el contador). Un semáforo puede ser liberado por otro hilo, no necesariamente el que lo adquirió.

Diferencias principales:

  • Propósito: Mutex para proteger secciones críticas, Semáforo para gestionar acceso a recursos.
  • Valor: Mutex (0 o 1), Semáforo (cualquier número no negativo).
  • Pertenencia: Mutex tiene un propietario (el hilo que lo adquirió), Semáforo no tiene un concepto claro de propiedad.
  • Quién puede liberarlo: Solo el propietario puede liberarlo en el mutex, cualquier hilo puede liberarlo en el semáforo.
#include <mutex> // Para std::mutex
#include <semaphore> // Para std::counting_semaphore

std::mutex mtx; // Mutex para proteger recurso

void critical_section() {
    mtx.lock(); // Adquirir mutex
    // Acceso al recurso compartido
    mtx.unlock(); // Liberar mutex
}

// Semáforo para gestionar acceso a 5 recursos
std::counting_semaphore<5> sem(5);

void access_resource() {
    sem.acquire(); // Adquirir recurso (decrementa contador)
    // Uso del recurso
    sem.release(); // Liberar recurso (aumenta contador)
}

Comparación en tabla:

Característica Mutex Semáforo
Tipo Objeto de sincronización (semáforo binario) Objeto de sincronización (contador)
Valor 0 (ocupado), 1 (libre) Número no negativo
Propósito Protección de secciones críticas, exclusión mutua Gestión de acceso a recursos limitados
Pertenencia Tiene propietario (el hilo que lo adquirió) No tiene un concepto claro de propiedad
Quién puede liberarlo Solo el propietario Cualquier hilo