Sobes.tech
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)