> Что происходит при дедлоке в главной очереди в iOS (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Совкомбанк
Стек: iOS, Swift
> Пример ответа
Дедлок (deadlock) в главной очереди (main queue) в iOS - это ситуация, когда поток выполнения (обычно главный поток) блокируется в ожидании ресурса, который сам же удерживает, или когда два потока взаимно блокируют друг друга. В контексте главной очереди это чаще всего происходит при синхронном вызове DispatchQueue.main.sync из самого главного потока.
Что конкретно происходит:
-
Главная очередь - это последовательная очередь, привязанная к главному потоку (UI-потоку). Она отвечает за обновление интерфейса и обработку событий.
-
Когда вы вызываете
DispatchQueue.main.sync { ... }из главного потока, вы говорите: «поставь этот блок в главную очередь и жди его выполнения». Но главный поток уже занят выполнением текущего кода (в котором находится этот вызов). Так как очередь последовательная, блок не может начать выполняться, пока не завершится текущий блок. А текущий блок не может завершиться, пока не выполнится синхронный вызов. Возникает взаимная блокировка - дедлок. -
Результат: приложение зависает (freeze) навсегда. Главный поток перестает обрабатывать события (касания, таймеры, анимации), UI перестает реагировать, и через некоторое время система может убить приложение (watchdog). Crash-логов обычно нет, только отчет о зависании.
Пример:
SWIFT// В главном потокеDispatchQueue.main.sync {print("Это никогда не выполнится")}// Сюда выполнение никогда не дойдет
Как избежать:
-
Никогда не вызывайте
syncна главной очереди из главного потока. Используйтеasync, если нужно выполнить что-то на главной очереди. -
Если вы уже находитесь в главном потоке, просто выполняйте код напрямую, без диспетчеризации.
-
Для синхронизации данных из фоновых потоков используйте другие механизмы (например,
DispatchQueue.global().syncили семафоры с осторожностью).
Дедлок в главной очереди - одна из самых распространенных ошибок при работе с GCD в iOS, приводящая к неотзывчивости приложения.
> Похожие задачи по mobile
Как показать пользователю, что все элементы успешно удалены
Какие альтернативы NSOperation существуют для отслеживания выполнения задач в iOS
Что происходит с таймером, если он запущен в глобальной очереди, а не в главной в iOS
Как работает таймер в iOS и с чем связана его работа
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью