Ответ
При инициализации DispatchSemaphore передаётся один параметр типа Int — начальное значение счётчика (value).
Назначение параметра:
- Определяет, сколько потоков могут одновременно войти в критическую секцию до блокировки.
- Значение
value— это количество доступных "разрешений".
Синтаксис:
let semaphore = DispatchSemaphore(value: 3) // 3 потока могут работать одновременно
Логика работы:
wait()— уменьшает счётчик на 1. Если счётчик становится отрицательным, поток блокируется.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() после завершения работы, иначе семафор может остаться заблокированным.