Определите порядок вывода чисел в программе (вариант 4)

Будут напечатаны 5 и 15, затем возникнет deadlock или диагностическое завершение на main.sync. Числа 10, 20, 25 и 30 не достигаются.

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

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

Будут напечатаны 5 и 15, затем возникнет deadlock или диагностическое завершение на main.sync. Числа 10, 20, 25 и 30 не достигаются.

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

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

Условие

Дана небольшая программа на Swift, в которой последовательно вызываются функции, выводящие числа на консоль, а также используются асинхронные и синхронные вызовы диспетчерской очереди main. Требуется определить, какие числа появятся в выводе и в каком порядке, учитывая особенности работы DispatchQueue.main.async и DispatchQueue.main.sync.

func runTask() {
    print(5)

    DispatchQueue.main.async {
        print(10)
    }

    print(15)

    DispatchQueue.main.sync {
        print(20)
    }

    print(25)
}

func runAnotherTask() {
    print(30)
}

// Main Thread
runTask()
runAnotherTask()

Обратите внимание, что вызов DispatchQueue.main.sync из главного потока приводит к дедлоку, поэтому часть кода может не выполниться.

Ответ

Будут напечатаны 5 и 15, затем возникнет deadlock или диагностическое завершение на main.sync. Числа 10, 20, 25 и 30 не достигаются.

Код явно запускается на главном потоке. Первый async-блок с 10 ждёт освобождения главной очереди, а текущий вызов runTask продолжает до 15. Затем main.sync требует выполнить другой блок на очереди, которая занята им самим. До завершения runTask очередь не дойдёт до 10, но runTask не может закончить ожидание. На практике libdispatch может обнаружить запрещённое синхронное ожидание и аварийно завершить процесс.

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

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

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

Подробнее