Выбор ответа Senior GCD и OperationQueue обновлено

Thread explosion в GCD

Вопрос

Код отправляет 500 блоков в DispatchQueue.global().async, и каждый блокируется на синхронном сетевом вызове. Что произойдёт?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: GCD будет поднимать новые потоки вместо заблокированных до лимита. Когда рабочий поток блокируется, GCD считает ядро свободным и поднимает новый поток.

Варианты ответа

  1. GCD будет поднимать новые потоки вместо заблокированных до лимитаправильный ответ
  2. GCD выполнит столько блоков, сколько ядер, остальные просто подождут
  3. Приложение упадёт: глобальная очередь принимает не больше 64 блоков
  4. Блоки автоматически станут асинхронными, и блокировки не будет

Разбор

Когда рабочий поток блокируется, GCD считает ядро свободным и поднимает новый поток. При сотнях блокирующих задач получается взрыв потоков: каждый занимает стек, планировщик тратит время на переключения, а при исчерпании лимита потоков очереди встают. Лечится ограничением параллельности (OperationQueue.maxConcurrentOperationCount, семафор), неблокирующими API или Swift Concurrency с кооперативным пулом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме