Sobes.tech
Middle

Kuo skiriasi semaforas nuo mutex?

sobes.tech AI

Atsakymas iš AI

Muteksas (Mutex, Mutual Exclusion) — sinchronizacijos mechanizmas, kuris garantuoja, kad vienu metu tik viena srautas turi prieigą prie kritinės sekcijos ar ištekliaus. Jis veikia pagal nuosavybės principą: srautas, kuris užblokavo muteksą, turi jį ir atrakinti.

Semaforas (Semaphore) — labiau bendras sinchronizacijos mechanizmas, kuris valdo prieigą prie ištekliaus, riboto tam tikru "leidimų" skaičiumi. Srautai gali gauti leidimą, jei jis yra prieinamas, ir tęsti vykdymą. Kai išteklius nebėra reikalingas, leidimas grąžinamas. Semaforas neturi nuosavybės koncepcijos; bet kuris srautas gali padidinti semaforo skaitiklį.

Pagrindiniai skirtumai:

  • Paskirtis: Muteksas naudojamas išskirtiniam prieigos valdymui (vienas srautas), semaforas — prieigos prie riboto išteklių pulko valdymui (kelios srautai iki limito).
  • Nuosavybė: Muteksas turi savininką (srautą, kuris jį užblokavo). Semaforas neturi savininko.
  • Skaitiklis: Muteksą galima laikyti kaip semaforą su skaitikliu, lygų 1. Semaforas gali turėti skaitiklį, didesnį nei 1.
  • Operacijos: Muteksas: WaitOne/Pulse/ReleaseMutex. Semaforas: WaitOne/Release.

Štai paprastas semaforo naudojimo pavyzdys C#:

// Sukuriame semaforą su pradiniu reikšme 2 ir maksimaliu 2.
// Leidžia vienu metu 2 srautams gauti prieigą prie ištekliaus.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);

// Srautas bando gauti prieigą prie ištekliaus
semaphore.WaitOne();
// ... darbo su ištekliu kodas ...
semaphore.Release(); // atlaisviname leidimą

Muteksas pavyzdys:

// Sukuriame muteksą
Mutex mutex = new Mutex();

// Srautas bando gauti išskirtinę prieigą
mutex.WaitOne();
// ... darbo su kritine sekcija kodas ...
mutex.ReleaseMutex(); // atlaisviname muteksą (tik savininkas gali)