Какой параметр передается при инициализации DispatchSemaphore в Swift?

«Какой параметр передается при инициализации DispatchSemaphore в Swift?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При инициализации DispatchSemaphore передаётся один параметр типа Intначальное значение счётчика (value).

Назначение параметра:

  • Определяет, сколько потоков могут одновременно войти в критическую секцию до блокировки.
  • Значение value — это количество доступных "разрешений".

Синтаксис:

let semaphore = DispatchSemaphore(value: 3) // 3 потока могут работать одновременно

Логика работы:

  1. wait() — уменьшает счётчик на 1. Если счётчик становится отрицательным, поток блокируется.
  2. signal() — увеличивает счётчик на 1. Если были заблокированные потоки, один из них разблокируется.

Практический пример:

let semaphore = DispatchSemaphore(value: 2) // Максимум 2 параллельных задачи

for i in 1...5 {
    DispatchQueue.global().async {
        semaphore.wait() // Запрашиваем доступ
        // Критическая секция (работа с общим ресурсом)
        print("Task (i) started")
        sleep(1)
        print("Task (i) finished")
        semaphore.signal() // Освобождаем слот
    }
}

Важно: Всегда вызывайте signal() после завершения работы, иначе семафор может остаться заблокированным.