Sobes.tech
Middle

Mutex və semafor ilə lock arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

C# dilində lock, Monitor.EnterMonitor.Exit istifadə üçün sintaktik şəkərdir və try-finally bloku ilə əhatə olunmuşdur ki, kilidi təminatlı şəkildə azad etsin. Bu, resursa yalnız bir axın tərəfindən giriş üçün eksklüziv giriş təmin edir. Əsasən, obyekt səviyyəsində ən sadə sinxronizasiya primitividir.

Mutex isə, bir resursa yalnız bir axın üçün bir neçə prosesdə eksklüziv giriş təmin etmək üçün istifadə edilə bilən sinxronizasiya primitividir. O, axın mülkiyyətinə malikdir: yalnız mutex-i alan axın onu azad edə bilər.

Semaphore isə, eyni zamanda bir neçə axının resursa girişini məhdudlaşdıran sinxronizasiya primitividir. Onun sayğacı var, giriş əldə olunduqda azaldılır və azad olunduqda artırılır.

Əsas fərqlər cədvəldə təqdim olunmuşdur:

Xüsusiyyət lock (Monitor) Mutex Semaphore
Görünürlük sahəsi Yalnız bir proses daxilində Proseslər arasında Proseslər arasında
Axın sayı Yalnız biri Yalnız biri (sahibi) Məhdud sayda
Sahibliyə malikdir Axına bağlı Axına bağlı Axına bağlı deyil
İstifadə Sadə sinxronizasiya Proseslər arasında sinxronizasiya, adlandırılmış mutexlər Resursun paralel girişini məhdudlaşdırır
İstisnalar Aydın AbandonedMutexException lazım deyil AbandonedMutexException lazım ola bilər AbandonedSemaphoreException yoxdur
// Lock istifadə nümunəsi
private readonly object _lockObject = new object();

public void DoSomethingWithLock()
{
    lock (_lockObject)
    {
        // Kritik bölmə
    }
}

// Mutex istifadə nümunəsi
using System.Threading;

private Mutex _mutex = new Mutex();

public void DoSomethingWithMutex()
{
    _mutex.WaitOne(); // Mutex əldə et
    try
    {
        // Kritik bölmə
    }
    finally
    {
        _mutex.ReleaseMutex(); // Mutex-i azad et
    }
}

// Semaphore istifadə nümunəsi
using System.Threading;

private Semaphore _semaphore = new Semaphore(3, 3); // Eyni zamanda 3 thread-ə icazə verir

public void DoSomethingWithSemaphore()
{
    _semaphore.WaitOne(); // "Giriş" semafora alınır
    try
    {
        // Kritik bölmə, 3 thread-lə məhdudlaşdırılıb
    }
    finally
    {
        _semaphore.Release(); // "Giriş" azad edilir
    }
}