Care este diferența dintre un semafor și un mutex?
sobes.tech AI
Răspuns de la AI
Un mutex (Mutual Exclusion) este un mecanism de sincronizare care garantează că, într-un moment dat, doar un fir de execuție are acces la secțiunea critică a codului sau la o resursă. Funcționează pe principiul de proprietate: firul de execuție care blochează mutex-ul trebuie să îl deblocheze.
Semaforul (Semaphore) este un mecanism de sincronizare mai general, care controlează accesul la o resursă limitată de un anumit număr de "permise". Firurile de execuție pot obține permisiunea dacă este disponibilă și pot continua execuția. Când resursa nu mai este necesară, permisiunea este returnată. Semaforul nu are conceptul de proprietate; orice fir de execuție poate crește contorul semaforului.
Diferențe cheie:
- Scop: Mutex-ul este folosit pentru acces exclusiv (un fir de execuție), semaforul pentru gestionarea accesului la un grup limitat de resurse (mai multe fire de execuție până la limita).
- Proprietate: Mutex-ul are un proprietar (firul de execuție care l-a blocat). Semaforul nu are proprietar.
- Contor: Mutex-ul poate fi considerat ca un semafor cu un contor egal cu 1. Semaforul poate avea un contor mai mare de 1.
- Operații: Mutex:
WaitOne/Pulse/ReleaseMutex. Semafor:WaitOne/Release.
Iată un exemplu simplu de utilizare a unui semafor în C#:
// Creăm un semafor cu valoarea inițială 2 și maximul 2.
// Permite ca până la 2 fire de execuție să acceseze simultan resursa.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);
// Firul de execuție încearcă să obțină acces la resursă
semaphore.WaitOne();
// ... lucru cu resursa ...
semaphore.Release(); // Eliberarea permisiunii
Exemplu de mutex:
// Creăm un mutex
Mutex mutex = new Mutex();
// Firul de execuție încearcă să obțină acces exclusiv
mutex.WaitOne();
// ... lucru cu secțiunea critică ...
mutex.ReleaseMutex(); // Eliberarea mutex-ului (numai proprietarul poate)