В чем разница между Dispatch barrier и Dispatch semaphore в Swift?

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

Ответ

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 Безопасная запись при параллельном чтении Ограничение пула потоков, мьютекс