Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про IOS: deadlock, dispatch, sync

В каких случаях вызов sync приводит к deadlock?

Вопрос проверяет понимание причин deadlock и умение анализировать порядок выполнения задач в GCD.

Короткий ответ

Deadlock возникает, когда поток ждет завершения задачи, которая не может начаться. Чаще всего это происходит при вызове sync на той же очереди, в которой уже выполняется код. Очередь ждет сама себя. В результате выполнение останавливается навсегда. Это одна из самых частых ошибок при работе с GCD.

Длинный ответ

Deadlock — это ситуация, когда выполнение кода полностью останавливается из-за взаимного ожидания.

Классический сценарий deadlock

Перед тем как приводить причины, рассмотрим базовый пример:

DispatchQueue.main.sync {
    // код
}

Если этот код вызывается уже на main queue, происходит deadlock.

Почему это происходит

  1. Serial queue выполняет одну задачу за раз
    Main queue — последовательная очередь.

  2. sync блокирует текущий поток
    Текущий поток ждет завершения блока.

  3. Очередь занята текущей задачей
    Новая задача не может начаться, пока не завершится текущая.

  4. Взаимное ожидание
    Поток ждет очередь, очередь ждет поток.

Другие сценарии deadlock

  1. Взаимные sync-вызовы между очередями
    Одна очередь синхронно ждет другую, а та — первую.

  2. Использование sync внутри lock-подобной логики
    Неправильная комбинация семафоров и sync.

  3. Вызов sync в callback, который уже удерживает ресурс

Как избежать deadlock

  • не вызывать sync на текущей очереди

  • использовать async, если нет жесткой необходимости

  • четко понимать, на какой очереди выполняется код

Вывод

Deadlock при dispatch sync возникает из-за блокировки потока и невозможности очереди выполнить ожидаемую задачу.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    8

Навыки

  • IOS

    IOS

Ключевые слова

#deadlock

#dispatch

#sync

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.