Čime se mutex i semafor razlikuju od lock?
sobes.tech АИ
Одговор од АИ
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(); // Ослобађање "доступа"
}
}