Вопрос проверяет понимание низкоуровневой синхронизации потоков и контроля доступа к ресурсам.
DispatchSemaphore используется для ограничения количества одновременно выполняемых задач или доступа к общему ресурсу. Он позволяет одному потоку ждать, пока другой освободит ресурс. В iOS его применяют редко и только в особых случаях. Чаще всего семафоры нужны для синхронизации фоновых операций.
DispatchSemaphore — это примитив синхронизации, предоставляемый GCD. Он позволяет контролировать доступ к ресурсу с помощью счетчика.
Определение:
Семафор — это объект, который блокирует или разрешает выполнение кода на основе внутреннего счетчика.
Основные операции:
wait() уменьшает счетчик и может заблокировать поток
signal() увеличивает счетчик и разблокирует ожидающий поток
Семафоры применяются:
для ограничения числа параллельных задач
при работе с небезопасными API
при необходимости дождаться завершения фоновой операции
Пример ограничения доступа:
let semaphore = DispatchSemaphore(value: 1)
DispatchQueue.global().async {
semaphore.wait()
// доступ к общему ресурсу
semaphore.signal()
}
Не рекомендуется:
блокировать main thread
использовать семафоры вместо высокоуровневых абстракций
применять их для обычной синхронизации UI
DispatchSemaphore — мощный, но опасный инструмент, который стоит использовать только при невозможности решить задачу более безопасными способами.