Sobes.tech
Middle

Kāda ir atšķirība starp semaforu un mutex?

sobes.tech AI

Atbilde no AI

Muteks (Mutex, Mutual Exclusion) — sinhronizācijas mehānisms, kas garantē, ka vienlaikus piekļuvi kritiskajai sekcijai vai resursam nodrošina tikai viens pavedienu. Tas darbojas pēc īpašumtiesību principa: pavediens, kurš bloķēja muteksu, to arī atbrīvo.

Semafors (Semaphore) — plašāks sinhronizācijas mehānisms, kas pārvalda piekļuvi resursam, kura ierobežota ar noteiktu "atļauju" skaitu. Pavedieni var saņemt atļauju, ja tā ir pieejama, un turpināt izpildi. Kad resursu vairs nevajag, atļauja tiek atgriezta. Semafors nav īpašumtiesību koncepcijas; jebkurš pavediens var palielināt semafora skaitītāju.

Galvenās atšķirības:

  • Mērķis: Muteksu izmanto izņēmuma piekļuvei (viens pavedienu), semafors — piekļuvei ierobežotam resursu pulkam (daudzi pavedieni līdz limitam).
  • Īpašumtiesības: Muteksam ir īpašnieks (pavediens, kurš to bloķēja). Semaforam nav īpašnieka.
  • Skaitītājs: Muteksu var uzskatīt par semaforu ar skaitītāju, kas ir vienāds ar 1. Semafors var būt ar skaitītāju lielāku par 1.
  • Operācijas: Muteksu: WaitOne/Pulse/ReleaseMutex. Semafors: WaitOne/Release.

Šeit ir vienkāršs semafora izmantošanas piemērs C#:

// Izveido semaforu ar sākotnējo vērtību 2 un maksimālo 2.
// Atļauj vienlaikus 2 pavedieniem piekļūt resursam.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);

// Pavediens mēģina iegūt piekļuvi resursam
semaphore.WaitOne();
// ... darbs ar resursu ...
semaphore.Release(); // atbrīvo atļauju

Muteks pavyzdis:

// Izveido muteksu
Mutex mutex = new Mutex();

// Pavediens mēģina iegūt izņēmuma piekļuvi
mutex.WaitOne();
// ... darbs ar kritisko sekciju ...
mutex.ReleaseMutex(); // atbrīvo muteksu (tikai īpašnieks var)