Sobes.tech
Middle

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ò)