> Что происходит при дедлоке в главной очереди в 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, приводящая к неотзывчивости приложения.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью