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