Sobes.tech
Junior — Middle

W jakich sytuacjach warto stosować mechanizm Semaphore do synchronizacji wątków?

sobes.tech AI

Odpowiedź od AI

Mechanizm Semaphore (semafor) jest używany do ograniczenia liczby wątków jednocześnie uzyskujących dostęp do określonego zasobu lub sekcji krytycznej.

Zaleca się stosowanie semafora, gdy:

  • Konieczne jest ograniczenie liczby operacji równoczesnych, na przykład dostęp do puli połączeń lub ograniczonej liczby plików.
  • Należy kontrolować równoległość, aby uniknąć przeciążenia systemu.
  • Wymagana jest synchronizacja wątków, gdy kilka wątków musi oczekiwać na zwolnienie zasobu.

W iOS semafory są często używane do zarządzania zadaniami asynchronicznymi, na przykład, aby oczekiwać na zakończenie wielu operacji lub ograniczyć liczbę wykonywanych jednocześnie zadań.

Przykład użycia DispatchSemaphore w Swift:

let semaphore = DispatchSemaphore(value: 3) // maksymalnie 3 wątki jednocześnie

func accessResource() {
    semaphore.wait() // zmniejsza licznik, jeśli 0, wątek jest blokowany
    // Praca z zasobem
    print("Wątek uzyskał dostęp")
    sleep(1) // symulacja pracy
    semaphore.signal() // zwiększa licznik, zwalnia miejsce
}

for _ in 1...10 {
    DispatchQueue.global().async {
        accessResource()
    }
}

W tym przykładzie, nie więcej niż 3 wątki może pracować z zasobem jednocześnie.