После 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.