Как ведёт себя глобальная очередь (DispatchQueue.global) при добавлении задач из нескольких потоков?

«Как ведёт себя глобальная очередь (DispatchQueue.global) при добавлении задач из нескольких потоков?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Глобальная очередь (DispatchQueue.global()) — это concurrent очередь. Задачи, добавленные из любых потоков, выполняются параллельно в пуле системных потоков.

Ключевые характеристики:

  1. Порядок не гарантирован — задачи начинают выполняться в порядке добавления, но завершаются в произвольном порядке.
  2. Параллелизм — система сама управляет количеством одновременных потоков.

Пример:

// Добавление задач из разных потоков
DispatchQueue.global().async { print("Task 1: (Thread.current)") }
DispatchQueue.global().async { print("Task 2: (Thread.current)") }
// Вывод может быть: Task 2, Task 1 (или наоборот)

Важные замечания:

  • Thread explosion — чрезмерное количество задач может привести к созданию множества потоков и снижению производительности.
  • Синхронизация — для доступа к общим ресурсам из задач на глобальной очереди используйте механизмы вроде DispatchSemaphore, NSLock или изолированных очередей (DispatchQueue(label: ..., attributes: .concurrent) с барьерами).