Что такое Dispatch Barrier в GCD?

«Что такое Dispatch Barrier в GCD?» — вопрос из категории Многопоточность, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Dispatch Barrier — это механизм в Grand Central Dispatch (GCD), обеспечивающий эксклюзивный доступ к ресурсу при работе с concurrent (параллельной) очередью. Он временно превращает параллельную очередь в последовательную для выполнения конкретной задачи.

Принцип работы:

  1. До барьера: Задачи в concurrent очереди выполняются параллельно.
  2. Барьерная задача: Задача, отправленная с флагом .barrier, ждет завершения всех уже запущенных задач.
  3. Во время барьера: Очередь становится последовательной, и барьерная задача выполняется одна.
  4. После барьера: Очередь снова становится concurrent для следующих задач.

Типичное применение: Создание потокобезопасных структур данных с оптимизацией для частого чтения (reader-writer lock).

Пример (Потокобезопасный кэш в Swift):

class ThreadSafeCache<Key: Hashable, Value> {
    private let concurrentQueue = DispatchQueue(label: "com.cache.queue", attributes: .concurrent)
    private var storage: [Key: Value] = [:]

    // Чтение (параллельное, не блокирующее)
    func getValue(for key: Key) -> Value? {
        return concurrentQueue.sync {
            storage[key]
        }
    }

    // Запись (эксклюзивная через барьер)
    func setValue(_ value: Value, for key: Key) {
        concurrentQueue.async(flags: .barrier) {
            self.storage[key] = value
        }
    }
}

Важное ограничение: Барьеры работают только с пользовательскими concurrent очередями, созданными с атрибутом .concurrent. Использование с глобальными очередями (DispatchQueue.global()) или главной очередью (DispatchQueue.main) не имеет эффекта.