Вопрос проверяет знание инструментов GCD для обеспечения потокобезопасности.
В GCD для синхронизации используют serial queue, DispatchBarrier, семафоры и синхронные блоки. Каждый способ подходит для разных сценариев и имеет свои ограничения. Наиболее безопасный и рекомендуемый вариант — изоляция состояния через serial queue.
GCD предоставляет несколько механизмов для защиты разделяемых данных.
Определение: serial queue выполняет задачи строго по одной.
let queue = DispatchQueue(label: "sync.queue")
queue.async {
// безопасный доступ
}
Это самый простой и надёжный способ.
Используется с concurrent queue:
чтение выполняется параллельно
запись блокирует другие задачи
queue.async(flags: .barrier) {
// запись
}
Подходит для ограничения доступа:
let semaphore = DispatchSemaphore(value: 1)
Требует аккуратного управления.
queue.sync:
блокирует текущий поток
может привести к deadlock при неправильном использовании
Для синхронизации в GCD предпочтительнее использовать serial queue или barrier. Семафоры и sync требуют особой осторожности.