Sobes.tech
Middle

V čem se liší mutex a semafor od locku?

sobes.tech AI

Odpověď od AI

lock v C# je syntaktický cukr pro použití Monitor.Enter a Monitor.Exit, zabalených v blok try-finally, aby bylo zajištěno uvolnění zámku. Poskytuje exkluzivní přístup k prostředku pro jeden vlákno. V podstatě je to nejjednodušší primitiv synchronizace na úrovni objektu.

Mutex je primitiv synchronizace, který lze použít k zajištění exkluzivního přístupu k prostředku pro jedno vlákno mezi více procesy. Má pojem vlastnictví vlákna: pouze vlákno, které získalo mutex, ho může uvolnit.

Semaphore je primitiv synchronizace, který omezuje počet vláken, která mohou současně získat přístup k prostředku. Má čítač, který se snižuje při získání přístupu a zvyšuje při jeho uvolnění.

Hlavní rozdíly jsou uvedeny v tabulce:

Charakteristika lock (Monitor) Mutex Semaphore
Rozsah viditelnosti Uvnitř jednoho procesu Mezi procesy Mezi procesy
Počet vláken Pouze jedno Pouze jedno (vlastník) Omezený počet
Vlastnictví Vázáno na vlákno Vázáno na vlákno Není vázáno na vlákno
Použití Jednoduchá synchronizace Synchronizace mezi procesy, pojmenované mutexy Omezení paralelního přístupu k prostředku
Výjimky Nevyžaduje explicitní zpracování AbandonedMutexException Vyžaduje zpracování AbandonedMutexException Neexistuje AbandonedSemaphoreException
// Příklad použití lock
private readonly object _lockObject = new object();

public void DoSomethingWithLock()
{
    lock (_lockObject)
    {
        // Kritická sekce
    }
}

// Příklad použití Mutex
using System.Threading;

private Mutex _mutex = new Mutex();

public void DoSomethingWithMutex()
{
    _mutex.WaitOne(); // Získat mutex
    try
    {
        // Kritická sekce
    }
    finally
    {
        _mutex.ReleaseMutex(); // Uvolnit mutex
    }
}

// Příklad použití Semaphore
using System.Threading;

private Semaphore _semaphore = new Semaphore(3, 3); // Umožňuje 3 vlákna najednou

public void DoSomethingWithSemaphore()
{
    _semaphore.WaitOne(); // Získat "přístup" k semaforu
    try
    {
        // Kritická sekce, omezená na 3 vlákna
    }
    finally
    {
        _semaphore.Release(); // Uvolnit "přístup"
    }
}