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