Sobes.tech
Middle

Ինչպե՞ս են mutex և semaphore-ը տարբերվում lock-ից։

sobes.tech AI

Պատասխան AI-ից

lock C#-ում — սա սինտաքսիկ շաքար է Monitor.Enter և Monitor.Exit օգտագործելու համար, որոնք պատված են try-finally բլոկով՝ ապահովելու համար բլոկավորման ազատում։ Այն ապահովում է բացառիկ մուտք դեպի ռեսուրս մեկ հոսքի համար։ Իրականում, սա ամենապարզ սինխրոնիզացիայի primitive-ն է օբյեկտի մակարդակով։

Mutex (մյուտեքս) — սա սինխրոնիզացիայի primitive է, որը կարող է օգտագործվել բացառիկ մուտք ապահովելու համար ռեսուրսին մեկ հոսքի համար մի քանի պրոցեսների հոսքերի միջև։ Այն ունի տիրապետության հասկացություն՝ միայն այն հոսքը, որը ստացել է մյուտեքսը, կարող է այն ազատել։

Semaphore (սեմաֆոր) — սա սինխրոնիզացիայի primitive է, որը սահմանափակում է միաժամանակ ռեսուրսին մուտք գործող հոսքերի քանակը։ Սեմաֆորը ունի հաշիվ, որը նվազում է մուտք գործելիս և ավելանում՝ ազատելու ժամանակ։

Հիմնական տարբերությունները ներկայացված են աղյուսակում՝

Գծագրություն lock (Monitor) Mutex Semaphore
Տիրապետման ոլորտը Միայն մեկ պրոցեսի ներսում Միջպրոցեսային Միջպրոցեսային
Հոսքերի քանակը Միայն մեկը Միայն մեկը (տիրապետող) Մեկից ավելի
Տիրապետում Կապված է հոսքին Կապված է հոսքին Չի կապված հոսքին
Օգտագործում Պարզ սինխրոնիզացիա Միջպրոցեսային սինխրոնիզացիա, անվանված մյուտեքսներ Միջպրոցեսային միաժամանակյա մուտքի սահմանափակում
Անհրաժեշտություն Չի պահանջում հատուկ մշակում AbandonedMutexException Պահանջում է AbandonedMutexException մշակումը Չի կա AbandonedSemaphoreException
// Օրինակ lock-ի օգտագործման
private readonly object _lockObject = new object();

public void DoSomethingWithLock()
{
    lock (_lockObject)
    {
        // Կրիտիկական հատված
    }
}

// Օրինակ Mutex-ի օգտագործման
using System.Threading;

private Mutex _mutex = new Mutex();

public void DoSomethingWithMutex()
{
    _mutex.WaitOne(); // Ստանալ մյուտեքսը
    try
    {
        // Կրիտիկական հատված
    }
    finally
    {
        _mutex.ReleaseMutex(); // Անհատական մյուտեքսը ազատել
    }
}

// Օրինակ Semaphore-ի օգտագործման
using System.Threading;

private Semaphore _semaphore = new Semaphore(3, 3); // Թույլատրում է 3 հոսք միաժամանակ

public void DoSomethingWithSemaphore()
{
    _semaphore.WaitOne(); // Ստանալ "մուտք" սեմաֆորին
    try
    {
        // Կրիտիկական հատված, սահմանափակված 3 հոսքներով
    }
    finally
    {
        _semaphore.Release(); // Անհատական մուտք ազատել
    }
}