Sobes.tech
Middle

Č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(); // Ослобађање "доступа"
    }
}