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(lubacquire), 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(lubrelease), 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.