Sobes.tech
Junior — Middle

Czy mógłbyś wyjaśnić, czym jest semafor i jak jest używany do synchronizacji procesów?

sobes.tech AI

Odpowiedź od AI

Semafor jest mechanizmem synchronizacji używanym do zarządzania dostępem do wspólnego zasobu w środowisku wielowątkowym lub wieloprocesowym. Zawiera licznik, który wskazuje, ile wątków lub procesów może jednocześnie uzyskać dostęp do zasobu.

Zasada działania:

  • Początkowo licznik semafora ustawiany jest na liczbę dostępnych zasobów.
  • Gdy wątek chce uzyskać dostęp, wywołuje operację wait (lub acquire), która zmniejsza licznik.
  • Jeśli licznik spadnie poniżej zera, wątek jest blokowany, oczekując na zwolnienie zasobu.
  • Gdy wątek zwalnia zasób, wywołuje signal (lub release), który zwiększa licznik i odblokowuje oczekujące wątki.

Na iOS, do pracy z semaforami często używa się klasy DispatchSemaphore z GCD:

let semaphore = DispatchSemaphore(value: 1) // 1 oznacza, że zasób jest dostępny dla jednego wątku

// W wątku:
semaphore.wait()   // czeka, aż zasób będzie dostępny
// Praca z zasobem
semaphore.signal() // zwalnia zasób

W ten sposób semafory pomagają unikać warunków wyścigu i zapewniają poprawny dostęp do zasobów współdzielonych.