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"
}
}