DevPrep

Все темы › Многопоточность и асинхронное программирование

Можно ли делать main.sync с главного потока? Что будет?

Junior PRO

Суть

Нельзя. DispatchQueue.main.sync { } блокирует текущий поток, пока главная очередь не выполнит блок. Но главная очередь привязана к главному потоку, который как раз и стоит в ожидании — классический дедлок sync на очередь, в которой уже находишься.

На практике приложение не зависает, а крашится: libdispatch знает, что главный поток владеет главной очередью, и прерывает процесс с EXC_BREAKPOINT и сообщением «BUG IN CLIENT OF LIBDISPATCH: dispatch_sync called on queue already owned by current thread». Та же проверка срабатывает для любой своей serial-очереди:

let queue = DispatchQueue(label: "serial")
queue.async {
    queue.sync { }        // sync на очередь, на которой уже выполняемся
}

Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.

Полный ответ — в DevPrep

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store