Sobes.tech
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)