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 |