Middle
Jaký je rozdíl mezi semaforem a mutexem?
sobes.tech AI
Odpověď od AI
Mutex (Mutual Exclusion) je mechanismus synchronizace, který zaručuje, že v daném okamžiku má přístup ke kritické sekci kódu nebo zdroji pouze jeden vlákno. Funguje na principu vlastnictví: vlákno, které mutex zablokovalo, ho musí také odblokovat.
Semafor (Semaphore) je obecnější mechanismus synchronizace, který řídí přístup ke zdroji omezenému určitým počtem "povolení". Vlákna mohou získat povolení, pokud je dostupné, a pokračovat ve vykonávání. Když zdroj již není potřeba, povolení je vráceno. Semafor nemá koncept vlastnictví; jakékoli vlákno může zvýšit čítač semaforu.
Klíčové rozdíly:
- Účel: Mutex se používá pro výlučný přístup (jedno vlákno), semafor pro řízení přístupu k omezenému poolu zdrojů (několik vláken až do limitu).
- Vlastnictví: Mutex má vlastníka (vlákno, které ho zablokovalo). Semafor nemá vlastníka.
- Čítač: Mutex lze považovat za semafor s čítačem rovným 1. Semafor může mít čítač větší než 1.
- Operace: Mutex:
WaitOne/Pulse/ReleaseMutex. Semafor:WaitOne/Release.
Zde je jednoduchý příklad použití semaforu v C#:
// Vytvoříme semafor s počáteční hodnotou 2 a maximem 2.
// Umožňuje současně přístup ke zdroji dvěma vláknům.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);
// Vlákno se pokouší získat přístup ke zdroji
semaphore.WaitOne();
// ... práce se zdrojem ...
semaphore.Release(); // Uvolnění povolení
Příklad mutexu:
// Vytvoření mutexu
Mutex mutex = new Mutex();
// Vlákno se pokouší získat výlučný přístup
mutex.WaitOne();
// ... práce s kritickou sekcí ...
mutex.ReleaseMutex(); // Uvolnění mutexu (pouze vlastník může)