Почему потоки используются для неосновных очередей? - PullRequest
0 голосов
/ 29 мая 2018

http://devstreaming.apple.com/videos/wwdc/2015/718b7aw9tq/718/718_hd_building_responsive_and_efficient_apps_with_gcd.mp4

enter image description here

при 35: 43.

, поскольку все потоки в пуле потоков используютсяпо параллельной очереди.Сбой блокировки происходит из-за того, что в основной очереди больше не будет доступного потока для выполнения задачи.

Я помню, что в главной очереди есть выделенный основной поток (или пул потоков ???), чтобы убедиться, чтоосновная очередь работает без проблем.

Какую часть я неправильно интерпретирую?

1 Ответ

0 голосов
/ 29 мая 2018

Для пояснения задачи, отправляемые в основную очередь, всегда будут выполняться в главном потоке, но основной поток не выделен для основной очереди.Задача, отправленная в другую очередь, может использовать любой доступный поток, включая основной поток.

В примере, показанном на слайде, основной поток выполняет цикл, отправляя асинхронные задачи.Внутри dispatch_async находится синхронный блок, который добавляет работу в очередь.Как только доступные потоки будут исчерпаны, он будет блокироваться, пока поток не станет доступным;поэтому основной поток теперь заблокирован.

Однако каждый поток отправляет синхронную работу обратно в основную очередь (для которой требуется основной поток), поэтому они будут блокировать ожидание основного потока.Так как нет приоритета, основной поток не может быть «повторно задан» для выполнения dispatch_sync, и у вас есть условие взаимоблокировки.

В итоге:

  • Две очереди взаимно блокируют друг друга (удержание и ожидание)
  • Нет приоритета
  • Результат: тупик.
...