Sobes.tech
Middle

Aký je rozdiel medzi semaforom a mutexom?

sobes.tech AI

Odpoveď od AI

Mutex (Mutual Exclusion) je mechanizmus synchronizácie, ktorý zaručuje, že v danom momente má prístup ku kritickej sekcii kódu alebo zdroju iba jedno vlákno. Funguje na princípe vlastníctva: vlákno, ktoré zablokovalo mutex, ho musí aj odblokovať.

Semafor (Semaphore) je všeobecnejší mechanizmus synchronizácie, ktorý riadi prístup ku zdroju obmedzenému určitým počtom "povolení". Vlákna môžu získať povolenie, ak je dostupné, a pokračovať vo vykonávaní. Keď už zdroj nie je potrebný, povolenie sa vráti. Semafor nemá koncept vlastníctva; akékoľvek vlákno môže zvýšiť čítač semaforu.

Kľúčové rozdiely:

  • Účel: Mutex sa používa na výlučný prístup (jedno vlákno), semafor — na riadenie prístupu k obmedzenému poolu zdrojov (viac vlákien do limitu).
  • Vlastníctvo: Mutex má vlastníka (vlákno, ktoré ho zablokovalo). Semafor nemá vlastníka.
  • Čítač: Mutex možno považovať za semafor s čítačom rovnakým 1. Semafor môže mať čítač väčší ako 1.
  • Operácie: Mutex: WaitOne/Pulse/ReleaseMutex. Semafor: WaitOne/Release.

Tu je jednoduchý príklad použitia semaforu v C#:

// Vytvoríme semafor s počiatočnou hodnotou 2 a maximom 2.
// Umožňuje súčasne 2 vlákna pristupovať k zdroju.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);

// Vlákno sa pokúša získať prístup ku zdroju
semaphore.WaitOne();
// ... práca so zdrojom ...
semaphore.Release(); // Uvoľnenie povolenia

Príklad mutexu:

// Vytvoríme mutex
Mutex mutex = new Mutex();

// Vlákno sa pokúša získať výlučný prístup
mutex.WaitOne();
// ... práca s kritickou sekciou ...
mutex.ReleaseMutex(); // Uvoľnenie mutexu (len vlastník môže)