Ответ
Dispatch barrier — это механизм синхронизации внутри concurrent DispatchQueue, который создает точку, где все ранее отправленные задачи выполняются параллельно, а задачи после барьера ждут его завершения.
Dispatch semaphore — это примитив синхронизации общего назначения, который управляет доступом к ресурсу или ограничивает количество одновременных исполнителей через счетчик.
Пример использования Dispatch barrier:
let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
// Эти задачи выполняются параллельно
concurrentQueue.async { print("Task 1") }
concurrentQueue.async { print("Task 2") }
// Барьерная задача: выполнится одна, пока другие ждут
concurrentQueue.async(flags: .barrier) {
print("Barrier task — exclusive write")
}
// Эти задачи ждут завершения барьера
concurrentQueue.async { print("Task 3") }
Применение: Для безопасной записи в общий ресурс из concurrent очереди (шаблон «чтение-запись»).
Пример использования Dispatch semaphore:
let semaphore = DispatchSemaphore(value: 2) // Разрешает 2 одновременных вызова
for i in 1...5 {
DispatchQueue.global().async {
semaphore.wait() // Уменьшает счетчик. Если 0 — ждет.
print("Task (i) started")
Thread.sleep(forTimeInterval: 1)
print("Task (i) finished")
semaphore.signal() // Увеличивает счетчик.
}
}
Применение: Ограничение числа одновременных сетевых запросов, защита критической секции (при value=1 — мьютекс).
| Сравнение: | Критерий | Dispatch Barrier | Dispatch Semaphore |
|---|---|---|---|
| Область действия | Конкретная concurrent очередь | Любые потоки/очереди | |
| Основная цель | Синхронизация задач в одной очереди | Контроль доступа к ресурсу/ограничение параллелизма | |
| Типичный use-case | Безопасная запись при параллельном чтении | Ограничение пула потоков, мьютекс |