Sobes.tech
Middle

Kuidas erinevad mutex ja semafor lockist?

sobes.tech AI

Vastus AI-lt

lock C# — see on süntaksiline suhkrustatud vorm Monitor.Enter ja Monitor.Exit kasutamiseks, mis on ümbritsetud try-finally plokiga, et tagada lukust vabastamine. See võimaldab eksklusiivset juurdepääsu ressursile ühe voolu jaoks. Tegelikult on see kõige lihtsam sünkroonimise primitiiv objekti tasandil.

Mutex (muteks) — see on sünkroonimise primitiiv, mida saab kasutada eksklusiivse juurdepääsu tagamiseks ressursile ühe voolu jaoks mitme protsessi vahel. Sellel on omandi mõiste: ainult see voog, kes on muteksi saanud, saab selle vabastada.

Semaphore (semafor) — see on sünkroonimise primitiiv, mis piirab samaaegselt ressursile juurdepääsevate voogude arvu. Semaforil on loendur, mis väheneb juurdepääsu saamisel ja suureneb selle vabastamisel.

Peamised erinevused on esitatud tabelis:

Omadus lock (Monitor) Mutex Semaphore
Nähtavusala Ühes protsessis Protsesside vahel Protsesside vahel
Voogude arv Ainult üks Ainult üks (omanik) Piiratud arv
Omandi Seotud vooluga Seotud vooluga Ei ole seotud vooluga
Kasutamine Lihtne sünkroonimine Sünkroonimine protsesside vahel, nimetatud muteksid Piirang paralleelsele juurdepääsule ressursile
Erandid Ei nõua selget töötlemist AbandonedMutexException Nõuab AbandonedMutexException töötlemist Ei ole AbandonedSemaphoreException
// Näide lock kasutamisest
private readonly object _lockObject = new object();

public void DoSomethingWithLock()
{
    lock (_lockObject)
    {
        // Kriitiline sektsioon
    }
}

// Näide Mutex kasutamisest
using System.Threading;

private Mutex _mutex = new Mutex();

public void DoSomethingWithMutex()
{
    _mutex.WaitOne(); // Saada muteks
    try
    {
        // Kriitiline sektsioon
    }
    finally
    {
        _mutex.ReleaseMutex(); // Vabasta muteks
    }
}

// Näide Semaphore kasutamisest
using System.Threading;

private Semaphore _semaphore = new Semaphore(3, 3); // Lubab 3 voolu samaaegselt

public void DoSomethingWithSemaphore()
{
    _semaphore.WaitOne(); // Saada "juurdepääs" semaforile
    try
    {
        // Kriitiline sektsioon, piiratud 3 vooluga
    }
    finally
    {
        _semaphore.Release(); // Vabasta "juurdepääs"
    }
}