Sobes.tech
Middle

V čom sa líši mutex a semafor od lock?

sobes.tech AI

Odpoveď od AI

lock v jazyku C# — je syntaktický cukr pre použitie Monitor.Enter a Monitor.Exit, zabalených v blok try-finally na zabezpečenie uvoľnenia zámku. Poskytuje exkluzívny prístup k zdroju pre jeden vlákno. V podstate je to najjednoduchší primitív synchronizácie na úrovni objektu.

Mutex (mutex) — je primitív synchronizácie, ktorý môže byť použitý na zabezpečenie exkluzívneho prístupu ku zdroju pre jeden vlákno vlákna v niekoľkých procesoch. Má pojem vlastníctva vlákna: iba vlákno, ktoré získalo mutex, ho môže uvoľniť.

Semaphore (semafor) — je primitív synchronizácie, ktorý obmedzuje počet vlákien, ktoré môžu súčasne získať prístup ku zdroju. Semafor má čítač, ktorý sa znižuje pri získaní prístupu a zvyšuje sa pri uvoľnení.

Hlavné rozdiely sú uvedené v tabuľke:

Charakteristika lock (Monitor) Mutex Semaphore
Oblasť viditeľnosti Vnútri jedného procesu Medzi procesmi Medzi procesmi
Počet vlákien Len jedno Len jedno (vlastník) Obmedzený počet
Vlastníctvo Viazané na vlákno Viazané na vlákno Nie je viazané na vlákno
Použitie Jednoduchá synchronizácia Synchronizácia medzi procesmi, pomenované muteksy Obmedzenie paralelného prístupu ku zdroju
Výnimky Nevyžaduje explicitnú spracovanie AbandonedMutexException Vyžaduje spracovanie AbandonedMutexException Neexistuje AbandonedSemaphoreException
// Príklad použitia lock
private readonly object _lockObject = new object();

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

// Príklad použitia Mutex
using System.Threading;

private Mutex _mutex = new Mutex();

public void DoSomethingWithMutex()
{
    _mutex.WaitOne(); // Získať mutex
    try
    {
        // Kritická sekcia
    }
    finally
    {
        _mutex.ReleaseMutex(); // Uvoľniť mutex
    }
}

// Príklad použitia Semaphore
using System.Threading;

private Semaphore _semaphore = new Semaphore(3, 3); // Povolené 3 vlákna naraz

public void DoSomethingWithSemaphore()
{
    _semaphore.WaitOne(); // Získať "prístup" semaforu
    try
    {
        // Kritická sekcia, prístup obmedzený na 3 vlákna
    }
    finally
    {
        _semaphore.Release(); // Uvoľniť "prístup"
    }
}