Qual è la differenza tra un semaforo e un mutex?
sobes.tech AI
Risposta dell'AI
Un mutex (Mutual Exclusion) è un meccanismo di sincronizzazione che garantisce che in un dato momento solo un thread abbia accesso alla sezione critica del codice o a una risorsa. Funziona secondo il principio di proprietà: il thread che blocca il mutex deve anche sbloccarlo.
Il semaforo (Semaphore) è un meccanismo di sincronizzazione più generale che controlla l'accesso a una risorsa limitata da un certo numero di "permessi". I thread possono ottenere un permesso se disponibile e continuare l'esecuzione. Quando la risorsa non è più necessaria, il permesso viene restituito. Il semaforo non ha un concetto di proprietà; qualsiasi thread può aumentare il contatore del semaforo.
Differenze chiave:
- Scopo: Il mutex viene usato per accesso esclusivo (un thread), il semaforo per gestire l'accesso a un pool limitato di risorse (più thread fino al limite).
- Proprietà: Il mutex ha un proprietario (il thread che lo ha bloccato). Il semaforo non ha proprietario.
- Contatore: Il mutex può essere considerato come un semaforo con un contatore uguale a 1. Il semaforo può avere un contatore maggiore di 1.
- Operazioni: Mutex:
WaitOne/Pulse/ReleaseMutex. Semaforo:WaitOne/Release.
Ecco un esempio semplice di utilizzo di un semaforo in C#:
// Creiamo un semaforo con valore iniziale 2 e massimo 2.
// Permette a 2 thread di accedere contemporaneamente alla risorsa.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);
// Il thread tenta di accedere alla risorsa
semaphore.WaitOne();
// ... lavoro con la risorsa ...
semaphore.Release(); // Rilascia il permesso
Esempio di mutex:
// Creiamo un mutex
Mutex mutex = new Mutex();
// Il thread tenta di ottenere accesso esclusivo
mutex.WaitOne();
// ... lavoro con la sezione critica ...
mutex.ReleaseMutex(); // Rilascia il mutex (solo il proprietario può)