Для пояснения задачи, отправляемые в основную очередь, всегда будут выполняться в главном потоке, но основной поток не выделен для основной очереди.Задача, отправленная в другую очередь, может использовать любой доступный поток, включая основной поток.
В примере, показанном на слайде, основной поток выполняет цикл, отправляя асинхронные задачи.Внутри dispatch_async
находится синхронный блок, который добавляет работу в очередь.Как только доступные потоки будут исчерпаны, он будет блокироваться, пока поток не станет доступным;поэтому основной поток теперь заблокирован.
Однако каждый поток отправляет синхронную работу обратно в основную очередь (для которой требуется основной поток), поэтому они будут блокировать ожидание основного потока.Так как нет приоритета, основной поток не может быть «повторно задан» для выполнения dispatch_sync
, и у вас есть условие взаимоблокировки.
В итоге:
- Две очереди взаимно блокируют друг друга (удержание и ожидание)
- Нет приоритета
- Результат: тупик.