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 |