DispatchQueue.main.sync на главном потоке
Вопрос
Что произойдёт, если на главном потоке вызвать DispatchQueue.main.sync { print("hi") }?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Блок выполнится сразу на текущем потоке, как обычный вызов
- Блок выполнится на фоновом потоке, а главный подождёт его
- Взаимная блокировка: главный поток ждёт блок, который ждёт егоправильный ответ
- Блок отложится до следующей итерации главного run loop и выполнится
Разбор
sync ставит блок в очередь и блокирует текущий поток до его завершения. Главная очередь последовательная и обслуживается главным потоком, который сейчас заблокирован ожиданием. Получается deadlock, на практике приложение падает с ошибкой libdispatch. То же с любой последовательной очередью: sync на неё изнутри её же блока. Отложенное выполнение это async.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Задача на Swift: OperationQueue с ограничением параллельности
Следующий вопрос
Инструменты GCD и их задачи
Термины по теме
Ещё по теме «GCD и OperationQueue»
- Асинхронная Operation
- Барьер для потокобезопасного кеша
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- Как дождаться нескольких запросов в GCD
- Задача на Swift: операции с зависимостями и критический путь
- Синхронный доступ к состоянию без очереди