Определите порядок вывода строк в консоль

После 1 главный блок печатает 2 и 4, затем main.sync из main queue приводит к deadlock/ошибке libdispatch. До 3, 5, 6, 7, 8 и 9 выполнение не доходит.

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

Что ответить на собеседовании

После 1 главный блок печатает 2 и 4, затем main.sync из main queue приводит к deadlock/ошибке libdispatch. До 3, 5, 6, 7, 8 и 9 выполнение не доходит.

Подробный разбор

Ответ с пояснениями

Условие

Вопрос: какой последовательностью будут напечатаны сообщения, учитывая асинхронные и синхронные вызовы очередей DispatchQueue. Проанализируйте код и укажите порядок вывода.

DispatchQueue.global(qos: .userInitiated).async {
    print("1")
    DispatchQueue.main.async {
        print("2")
        DispatchQueue.main.async {
            print("3")
        }
        print("4")
        DispatchQueue.main.sync {
            print("5")
        }
        print("6")
        DispatchQueue.main.async {
            print("7")
            DispatchQueue.main.sync {
                print("8")
            }
        }
        print("9")
    }
    print("10")
}

Ответ

После 1 главный блок печатает 2 и 4, затем main.sync из main queue приводит к deadlock/ошибке libdispatch. До 3, 5, 6, 7, 8 и 9 выполнение не доходит.

3 поставлена в главную очередь, но не может исполниться, пока текущий главный блок не завершён. Этот блок синхронно ждёт работу на той же очереди, создавая взаимную блокировку; среда может диагностировать её и аварийно завершить процесс. 10 выполняется в global queue после постановки главного блока и может перемежаться с 2 и 4; при аварийном завершении не гарантируется, что она вообще успеет напечататься. Гарантированные отношения до сбоя: 1 раньше 2, а 2 раньше 4.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее