Sobes.tech
Middle

Care este diferența dintre mutex, semafor și lock?

sobes.tech AI

Răspuns de la AI

lock în C# este un zahăr sintactic pentru utilizarea Monitor.Enter și Monitor.Exit, învelite într-un bloc try-finally pentru a garanta eliberarea blocajului. Oferă acces exclusiv la o resursă pentru un singur fir de execuție. În esență, este cel mai simplu primitiv de sincronizare la nivel de obiect.

Mutex este un primitiv de sincronizare care poate fi folosit pentru a oferi acces exclusiv la o resursă pentru un singur fir de execuție între mai multe procese. Are un concept de proprietate asupra firului: doar firul care a obținut mutex-ul îl poate elibera.

Semaphore este un primitiv de sincronizare care limitează numărul de fire de execuție care pot accesa o resursă simultan. Are un contor care scade la obținerea accesului și crește la eliberare.

Diferențele principale sunt prezentate în tabel:

Caracteristică lock (Monitor) Mutex Semaphore
Domeniu de vizibilitate În interiorul unui proces Între procese Între procese
Număr de fire de execuție Doar unul Doar unul (proprietar) Număr limitat
Proprietate Legat de firul de execuție Legat de firul de execuție Nu legat de firul de execuție
Utilizare Sincronizare simplă Sincronizare între procese, mutex-uri numite Limitarea accesului paralel la o resursă
Excepții Nu necesită gestionare explicită a AbandonedMutexException Necesită gestionare a AbandonedMutexException Nu există AbandonedSemaphoreException
// Exemplu de utilizare lock
private readonly object _lockObject = new object();

public void DoSomethingWithLock()
{
    lock (_lockObject)
    {
        // Secțiune critică
    }
}

// Exemplu de utilizare Mutex
using System.Threading;

private Mutex _mutex = new Mutex();

public void DoSomethingWithMutex()
{
    _mutex.WaitOne(); // Obține mutex-ul
    try
    {
        // Secțiune critică
    }
    finally
    {
        _mutex.ReleaseMutex(); // Eliberează mutex-ul
    }
}

// Exemplu de utilizare Semaphore
using System.Threading;

private Semaphore _semaphore = new Semaphore(3, 3); // Permite 3 fire de execuție simultan

public void DoSomethingWithSemaphore()
{
    _semaphore.WaitOne(); // Obține "acces" la semafor
    try
    {
        // Secțiune critică, limitată la 3 fire
    }
    finally
    {
        _semaphore.Release(); // Eliberează "acces"
    }
}