Sobes.tech
Junior — Middle

Czym różnią się mechanizmy wzajemnego wykluczania Lock i Semaphore w zarządzaniu dostępem do zasobów?

sobes.tech AI

Odpowiedź od AI

Lock (wyłącznik wzajemny) i Semaphore (semafor) to mechanizmy synchronizacji, ale różnią się funkcjonalnością i zastosowaniem:

  • Lock (Mutex)

    • Zaprojektowany do zapewnienia wyłącznego dostępu do zasobu.
    • Tylko jeden wątek może posiadać Lock w danym momencie.
    • Jeśli Lock jest zajęty, inne wątki czekają na jego zwolnienie.
    • Używany do ochrony sekcji krytycznych.
  • Semaphore

    • Ma licznik, który określa, ile wątków może jednocześnie uzyskać dostęp do zasobu.
    • Może zezwalać na dostęp wielu wątkom jednocześnie (np. semafor z licznikiem 3 pozwala 3 wątkom na dostęp jednocześnie).
    • Używany do zarządzania dostępem do ograniczonych zasobów.

Przykład w C#:

// Mutex
Mutex mutex = new Mutex();
mutex.WaitOne(); // przejęcie
// sekcja krytyczna
mutex.ReleaseMutex(); // zwolnienie

// Semaphore
Semaphore semaphore = new Semaphore(3, 3); // maksymalnie 3 jednoczesne dostępy
semaphore.WaitOne();
// praca z zasobem
semaphore.Release();

W związku z tym, Lock jest szczególnym przypadkiem semafora z maksymalnym licznikiem 1.