Sobes.tech
Junior — Middle

Czy możesz wyjaśnić, czym jest semafor w kontekście programowania i synchronizacji wątków?

sobes.tech AI

Odpowiedź od AI

Semafor to mechanizm synchronizacji, który jest używany do kontrolowania dostępu wielu wątków do wspólnego zasobu.

Zawiera licznik, który wskazuje, ile wątków może jednocześnie uzyskać dostęp do zasobu. Gdy wątek chce wejść do sekcji krytycznej, próbuje "złapać" semafor:

  • Jeśli licznik jest większy od zera, jest on zmniejszany o jeden, a wątek kontynuuje pracę.
  • Jeśli licznik jest równy zero, wątek jest blokowany i czeka, aż inny wątek zwolni semafor.

Gdy wątek kończy pracę z zasobem, zwalnia semafor, zwiększając licznik, co pozwala innym wątkom kontynuować.

Przykład użycia semafora w Swift (iOS):

let semaphore = DispatchSemaphore(value: 2) // pozwalamy na jednoczesną pracę 2 wątków

DispatchQueue.global().async {
    semaphore.wait() // próba złapania semafora
    print("Wątek rozpoczął pracę")
    sleep(2) // symulacja pracy
    print("Wątek zakończył pracę")
    semaphore.signal() // zwalniamy semafor
}

W ten sposób semafor pomaga kontrolować liczbę jednocześnie działających wątków z wspólnym zasobem, zapobiegając warunkom wyścigu i zapewniając poprawne działanie.