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)