Вопрос проверяет понимание критических ошибок многопоточности и умение их предотвращать.
Deadlock — это ситуация, когда потоки навсегда ждут друг друга. Каждый поток удерживает ресурс и ожидает освобождения другого. В результате выполнение останавливается. Deadlock чаще всего возникает из-за неправильной синхронизации. Это одна из самых опасных ошибок многопоточности.
Deadlock — это логическая ошибка, при которой несколько потоков или очередей оказываются в состоянии взаимной блокировки.
Deadlock — это состояние системы, в котором дальнейшее выполнение невозможно из-за циклического ожидания ресурсов.
Перед перечислением важно понимать, что deadlock не лечится автоматически.
Поток A захватывает ресурс X
Поток B захватывает ресурс Y
Поток A ждёт ресурс Y
Поток B ждёт ресурс X
Ни один поток не может продолжить выполнение
Один из самых распространённых случаев в iOS — блокировка главной очереди.
DispatchQueue.main.sync {
// deadlock, если вызывается с main thread
}
Почему это происходит:
sync блокирует текущий поток
Главная очередь ждёт завершения блока
Блок не может начаться, потому что поток уже заблокирован
Вложенные sync вызовы
Неправильный порядок захвата locks
Использование semaphore без signal()
Блокировка главной очереди
Не вызывать sync на текущей очереди
Соблюдать единый порядок захвата ресурсов
Минимизировать использование locks
Использовать async вместо sync
Deadlock — критическая ошибка, полностью останавливающая выполнение. Грамотная архитектура и аккуратная синхронизация — ключ к её предотвращению.