Вопрос проверяет понимание deadlock и умение анализировать ошибки синхронизации в GCD.
Deadlock в serial queue возникает, когда очередь ждёт выполнения задачи, которая не может начаться.
Чаще всего это происходит при вызове sync на той же очереди.
Очередь занята текущей задачей и не может выполнить следующую.
В результате приложение зависает.
Deadlock — одна из самых частых и опасных ошибок при работе с GCD.
Deadlock — это ситуация, когда выполнение кода останавливается навсегда из-за взаимного ожидания.
let queue = DispatchQueue(label: "com.app.serial")
queue.sync {
queue.sync {
// этот код никогда не выполнится
}
}
Перед тем как перейти к перечислению, важно понять принцип работы serial queue.
Serial queue выполняет только одну задачу за раз.
Внешний sync занимает очередь
Внутренний sync ждёт освобождения очереди
Очередь не может освободиться, пока не завершится текущая задача
Частый реальный пример:
DispatchQueue.main.sync {
// deadlock
}
Если код уже выполняется на main thread, sync приводит к зависанию.
Deadlock в serial queue возникает при синхронном ожидании самой себя. Никогда не вызывай sync на той же очереди, в которой уже выполняешься.