Sobes.tech
Middle

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