Может ли дедлок возникать между задачами на разных очередях
Что проверяют
Понимаете ли вы, что дедлок возникает из-за цикла ожидания, а не из-за «одной очереди», и умеете ли найти его в коде на GCD. Следом часто просят объяснить, почему sync на свою же очередь роняет приложение, а цикл между разными очередями просто вешает его.
Как отвечать
Да, может. Дедлоку не важно, на скольких очередях живут задачи, ему нужен цикл: задача ждёт то, что выполнится только после неё. Типовые сценарии:
- взаимный
sync: задача на последовательной очереди A вызываетqueueB.sync, а задача на очереди B в это время вызываетqueueA.sync. Обе очереди заняты ожиданием; - главный поток и семафор: главный поток стоит на
semaphore.wait()илиgroup.wait(), а фоновая задача, которая должна подать сигнал, сначала делаетDispatchQueue.main.syncради обновления UI; - порядок блокировок: два потока берут
NSLockилиos_unfair_lockв разном порядке, очереди тут просто место исполнения; - истощение пула: задачи блокируются в ожидании работы, которой уже не хватает потоков. В Swift Concurrency пул ограничен числом ядер, поэтому
semaphore.wait()внутриTaskособенно опасен.
Частный случай sync на ту же последовательную очередь libdispatch распознаёт и роняет приложение. Межочередной цикл он не видит, интерфейс просто зависает.
Профилактика: по умолчанию async, единый порядок захвата блокировок, никаких блокирующих ожиданий на главном потоке, проверка контекста через dispatchPrecondition(condition: .notOnQueue(queue)), в новом коде акторы и await. Диагностика: пауза в отладчике Xcode и стеки всех потоков, зависшие стоят внутри sync или wait.
Где спотыкаются
Считают, что разные очереди гарантируют безопасность. Последовательная очередь защищает от гонок внутри себя, но не от цикла ожидания между очередями.
Лечат зависание таймаутом wait(timeout:). Это прячет симптом: код идёт дальше без нужного результата, и ошибка становится плавающей.
Рассказывают абстрактную историю про ресурсы R1 и R2 из учебника по ОС. На iOS-собеседовании ждут пример с DispatchQueue и sync, иначе ответ выглядит заученным.