Sobes.tech
Junior

Qual è la differenza tra un mutex e un semaforo?

sobes.tech AI

Risposta dell'AI

Un mutex è un semaforo binario che è libero (valore 1) o occupato (valore 0). Viene utilizzato per proteggere le sezioni critiche e garantire un accesso esclusivo a una risorsa. Solo il thread che ha acquisito il mutex può liberarlo.

Il semaforo è una generalizzazione del mutex, che rappresenta un contatore. Può assumere valori non negativi ed è usato per gestire l'accesso a un numero limitato di risorse. Un thread può acquisire un semaforo se il contatore è maggiore di zero (riducendolo), e liberarlo (aumentando il contatore). Un semaforo può essere liberato da un altro thread, non necessariamente quello che lo ha acquisito.

Differenze principali:

  • Scopo: Mutex per proteggere le sezioni critiche, Semaforo per gestire l'accesso alle risorse.
  • Valore: Mutex (0 o 1), Semaforo (qualsiasi numero non negativo).
  • Proprietà: Mutex ha un proprietario (il thread che lo ha acquisito), Semaforo non ha un concetto chiaro di proprietà.
  • Chi può liberarlo: Solo il proprietario può liberarlo nel mutex, qualsiasi thread può liberarlo nel semaforo.
#include <mutex> // Per std::mutex
#include <semaphore> // Per std::counting_semaphore

std::mutex mtx; // Mutex per proteggere la risorsa

void critical_section() {
    mtx.lock(); // Acquisizione del mutex
    // Accesso alla risorsa condivisa
    mtx.unlock(); // Liberazione del mutex
}

// Semaforo per gestire l'accesso a 5 risorse
std::counting_semaphore<5> sem(5);

void access_resource() {
    sem.acquire(); // Acquisizione della risorsa (diminuisce il contatore)
    // Uso della risorsa
    sem.release(); // Liberazione della risorsa (aumenta il contatore)
}

Confronto in tabella:

Caratteristica Mutex Semaforo
Tipo Oggetto di sincronizzazione (semaforo binario) Oggetto di sincronizzazione (contatore)
Valore 0 (occupato), 1 (libero) Numero non negativo
Scopo Protezione delle sezioni critiche, esclusione mutua Gestione dell'accesso alle risorse limitate
Proprietà Ha un proprietario (il thread che lo ha acquisito) Non ha un concetto chiaro di proprietà
Chi può liberarlo Solo il proprietario Qualsiasi thread