Kā atšķiras mutex un semafors no lock?
sobes.tech AI
Atbilde no AI
lock C# — tas ir sintaktisks cukurs Monitor.Enter un Monitor.Exit izmantošanai, kas ir ietverts try-finally blokā, lai garantētu bloķēšanas atbrīvošanu. Tas nodrošina ekskluzīvu piekļuvi resursam vienam plūsmai. Patiesībā, tas ir vienkāršākais sinhronizācijas primitives objekta līmenī.
Mutex (mutex) — tas ir sinhronizācijas primitives, ko var izmantot, lai nodrošinātu ekskluzīvu piekļuvi resursam vienai plūsmai vairāku procesu starpā. Tam ir īpašuma jēdziens: tikai tā plūsma, kas ir ieguvusi mutex, to var atbrīvot.
Semaphore (semafors) — tas ir sinhronizācijas primitives, kas ierobežo to plūsmu skaitu, kas vienlaikus var piekļūt resursam. Semafors ir skaitītājs, kas samazinās, saņemot piekļuvi, un palielinās, to atbrīvojot.
Galvenās atšķirības ir attēlotas tabulā:
| Raksturlielums | lock (Monitor) |
Mutex |
Semaphore |
|---|---|---|---|
| Neredzamības sfēra | iekš viena procesa | starp procesiem | starp procesiem |
| Plūsmu skaits | tikai viens | tikai viens (īpašnieks) | ierobežots skaits |
| Piederība | saistīta ar plūsmu | saistīta ar plūsmu | nav saistīta ar plūsmu |
| Lietošana | vienkārša sinhronizācija | sinhronizācija starp procesiem, nosauktais muteks | ierobežojums paralēlajai piekļuvei resursam |
| Izņēmumi | neprasa skaidru apstrādi AbandonedMutexException | prasa apstrādi AbandonedMutexException | nav AbandonedSemaphoreException |
// Piemērs ar lock
private readonly object _lockObject = new object();
public void DoSomethingWithLock()
{
lock (_lockObject)
{
// Kritiskā sekcija
}
}
// Piemērs ar Mutex
using System.Threading;
private Mutex _mutex = new Mutex();
public void DoSomethingWithMutex()
{
_mutex.WaitOne(); // Iegūt muteksu
try
{
// Kritiskā sekcija
}
finally
{
_mutex.ReleaseMutex(); // Atbrīvot muteksu
}
}
// Piemērs ar Semaphore
using System.Threading;
private Semaphore _semaphore = new Semaphore(3, 3); // Atļauj 3 plūsmām vienlaikus
public void DoSomethingWithSemaphore()
{
_semaphore.WaitOne(); // Iegūt "piekļuvi" semaforam
try
{
// Kritiskā sekcija, ierobežota līdz 3 plūsmām
}
finally
{
_semaphore.Release(); // Atbrīvot "piekļuvi"
}
}