Ответ
Dispatch Barrier — это механизм в Grand Central Dispatch (GCD), обеспечивающий эксклюзивный доступ к ресурсу при работе с concurrent (параллельной) очередью. Он временно превращает параллельную очередь в последовательную для выполнения конкретной задачи.
Принцип работы:
- До барьера: Задачи в concurrent очереди выполняются параллельно.
- Барьерная задача: Задача, отправленная с флагом
.barrier, ждет завершения всех уже запущенных задач. - Во время барьера: Очередь становится последовательной, и барьерная задача выполняется одна.
- После барьера: Очередь снова становится 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) не имеет эффекта.