Qual è la differenza tra mutex, semaforo e lock?
sobes.tech AI
Risposta dell'AI
lock in C# è uno zucchero sintattico per l'uso di Monitor.Enter e Monitor.Exit, racchiusi in un blocco try-finally per garantire il rilascio della lock. Fornisce accesso esclusivo a una risorsa per un singolo thread. In sostanza, è il primitive di sincronizzazione più semplice a livello di oggetto.
Mutex è un primitive di sincronizzazione che può essere usato per fornire accesso esclusivo a una risorsa per un singolo thread tra più processi. Ha un concetto di proprietà del thread: solo il thread che ha ottenuto il mutex può rilasciarlo.
Semaphore è un primitive di sincronizzazione che limita il numero di thread che possono accedere a una risorsa contemporaneamente. Ha un contatore che diminuisce quando si ottiene l'accesso e aumenta quando si rilascia.
Le principali differenze sono presentate nella tabella:
| Caratteristica | lock (Monitor) |
Mutex |
Semaphore |
|---|---|---|---|
| Ambito di visibilità | Dentro un processo | Tra processi | Tra processi |
| Numero di thread | Solo uno | Solo uno (proprietario) | Numero limitato |
| Proprietà | Legato al thread | Legato al thread | Non legato al thread |
| Uso | Sincronizzazione semplice | Sincronizzazione tra processi, mutex nominati | Limitazione dell'accesso parallelo a una risorsa |
| Eccezioni | Non richiede gestione esplicita di AbandonedMutexException | Richiede gestione di AbandonedMutexException | Nessuna AbandonedSemaphoreException |
// Esempio di utilizzo di lock
private readonly object _lockObject = new object();
public void DoSomethingWithLock()
{
lock (_lockObject)
{
// Sezione critica
}
}
// Esempio di utilizzo di Mutex
using System.Threading;
private Mutex _mutex = new Mutex();
public void DoSomethingWithMutex()
{
_mutex.WaitOne(); // Ottenere il mutex
try
{
// Sezione critica
}
finally
{
_mutex.ReleaseMutex(); // Rilasciare il mutex
}
}
// Esempio di utilizzo di Semaphore
using System.Threading;
private Semaphore _semaphore = new Semaphore(3, 3); // Permette 3 thread contemporaneamente
public void DoSomethingWithSemaphore()
{
_semaphore.WaitOne(); // Ottenere "l'accesso" al semaforo
try
{
// Sezione critica, accesso limitato a 3 thread
}
finally
{
_semaphore.Release(); // Rilasciare "l'accesso"
}
}