Middle
Jaka jest różnica między semaforem a mutexem?
sobes.tech AI
Odpowiedź od AI
Mutex (Mutual Exclusion) — mechanizm synchronizacji, który gwarantuje, że w danym momencie tylko jeden wątek ma dostęp do sekcji krytycznej kodu lub zasobu. Działa na zasadzie własności: wątek, który zablokował mutex, musi go również odblokować.
Semaphore (Semaphore) — bardziej ogólny mechanizm synchronizacji, który zarządza dostępem do zasobu ograniczonego przez określoną liczbę "uprawnień". Wątki mogą uzyskać uprawnienie, jeśli jest dostępne, i kontynuować wykonywanie. Gdy zasób nie jest już potrzebny, uprawnienie jest zwracane. Semaphore nie ma koncepcji własności; dowolny wątek może zwiększyć licznik semafora.
Kluczowe różnice:
- Cel: Mutex służy do wyłącznego dostępu (jeden wątek), semaphore — do zarządzania dostępem do ograniczonej puli zasobów (kilka wątków do limitu).
- Własność: Mutex ma właściciela (wątek, który go zablokował). Semaphore nie ma właściciela.
- Licznik: Mutex można traktować jako semaphore z licznikiem równym 1. Semaphore może mieć licznik większy niż 1.
- Operacje: Mutex:
WaitOne/Pulse/ReleaseMutex. Semaphore:WaitOne/Release.
Oto prosty przykład użycia semafora w C#:
// Tworzymy semaphore z wartością początkową 2 i maksymalną 2.
// Pozwala jednocześnie 2 wątkom uzyskać dostęp do zasobu.
SemaphoreSlim semaphore = new SemaphoreSlim(2, 2);
// Wątek próbuje uzyskać dostęp do zasobu
semaphore.WaitOne();
// ... praca z zasobem ...
semaphore.Release(); // Zwolnienie pozwolenia
Przykład mutex:
// Tworzymy mutex
Mutex mutex = new Mutex();
// Wątek próbuje uzyskać wyłączny dostęp
mutex.WaitOne();
// ... praca z sekcją krytyczną ...
mutex.ReleaseMutex(); // Zwolnienie mutexa (tylko właściciel może)