Sobes.tech
Junior — Middle

Jak jest realizowany mechanizm semafora w systemach synchronizacji?

sobes.tech AI

Odpowiedź od AI

Mechanizm semafora w systemach synchronizacji jest używany do zarządzania dostępem do wspólnych zasobów przez wiele wątków lub procesów. Semafor to licznik, który pokazuje, ile wątków może jednocześnie uzyskać dostęp do zasobu.

W iOS (i ogólnie w systemach opartych na POSIX) semafory są implementowane za pomocą API, na przykład dispatch_semaphore w GCD (Grand Central Dispatch). Główne operacje to:

  • wait (lub wait(timeout:)) — zmniejsza licznik semafora. Jeśli licznik jest równy zero, wątek jest blokowany i czeka, aż inny wątek wywoła signal.
  • signal — zwiększa licznik, odblokowując oczekujący wątek, jeśli taki istnieje.

Przykład użycia w Swift:

let semaphore = DispatchSemaphore(value: 1) // semafor binarny

// W jednym wątku
semaphore.wait() // próbujemy wejść
// sekcja krytyczna
semaphore.signal() // wychodzimy

W ten sposób semafor pozwala ograniczyć liczbę operacji wykonywanych jednocześnie, na przykład dostęp do bazy danych lub zasobu sieciowego.

Ważne punkty:

  • Jeśli wartość semafora jest większa niż 1, pozwala kilku wątkom przejść jednocześnie.
  • Jeśli jest równa 1, jest to semafor binarny, podobny do mutexa.
  • Użycie semaforów pomaga unikać warunków wyścigu i zapewnia poprawną synchronizację.