Sobes.tech
Middle

Каква е разликата между mutex и семафор и lock?

sobes.tech AI

Отговор от AI

lock в C# — това е синтактичен захар за използване на Monitor.Enter и Monitor.Exit, обвити в блок try-finally за гарантирано освобождаване на блокировката. Той предоставя изключителен достъп до ресурса за един поток. По същество, това е най-простият примитив за синхронизация на ниво обект.

Mutex (мютекс) — това е примитив за синхронизация, който може да се използва за предоставяне на изключителен достъп до ресурс за един поток потокове в няколко процеса. Той има понятие за владение на потока: само потокът, който е получил мютекса, може да го освободи.

Semaphore (семафор) — това е примитив за синхронизация, който ограничава броя на потоковете, които могат да получат достъп до ресурса едновременно. Семафорът има брояч, който намалява при получаване на достъп и се увеличава при освобождаване.

Основните разлики са представени в таблицата:

Характеристика 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(); // Освобождаване на "достъпа"
    }
}