Ответ
При создании пользовательской очереди через конструктор DispatchQueue(label:) по умолчанию создается последовательная (serial) очередь.
Ключевые моменты:
- Serial очередь: Задачи выполняются строго по очереди, одна за другой.
- Concurrent очередь: Задачи могут выполняться параллельно, если есть доступные потоки.
Примеры создания очередей в Swift:
// Последовательная очередь (по умолчанию)
let serialQueue = DispatchQueue(label: "com.example.serial")
// Параллельная очередь (требует явного указания атрибута)
let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
Важные исключения из «правила по умолчанию»:
- Глобальные очереди (
DispatchQueue.global()) всегда являются параллельными (concurrent). - Main очередь (
DispatchQueue.main) — это специальная последовательная очередь, связанная с главным потоком для обновления UI.
Почему serial по умолчанию? Это безопаснее, так как исключает гонки данных (data races) при доступе к общим ресурсам из задач в одной очереди.