Sobes.tech
Middle

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"
    }
}