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(); // "Доступ" бошотуу
    }
}