Какие серийные системные очереди существуют
Что проверяют
Знаете ли вы, что системная серийная очередь в GCD по сути одна, и отличаете ли серийность от выполнения на одном потоке. Следом обычно просят объяснить, что будет при DispatchQueue.main.sync с главного потока, или спрашивают, как это соотносится с акторами.
Как отвечать
Начните с прямого ответа: система даёт одну серийную очередь, главную. Всё остальное либо конкурентное, либо создаётся вами.
DispatchQueue.main: серийная, привязана к главному потоку и его run loop. Здесь работают UIKit и SwiftUI, поэтому задачи в ней должны быть короткими;- глобальные очереди
DispatchQueue.global(qos:): системные, но конкурентные. Отличаются классом QoS:.userInteractive,.userInitiated,.default,.utility,.background; - своя очередь
DispatchQueue(label:): по умолчанию серийная, конкурентной её делаетattributes: .concurrent. Исполняется она всё равно на пуле потоков глобальных очередей через target queue; OperationQueue.main: обёртка над главной очередью, тоже серийная. ОбычнаяOperationQueueсmaxConcurrentOperationCount = 1выполняет операции по одной, но порядок зависит от готовности, зависимостей и приоритетов, строгого FIFO нет;MainActorи акторы: в Swift Concurrency роль серийной очереди играет актор. Он не пускает два куска кода к своему состоянию одновременно, но реентерабелен: на каждомawaitможет выполниться другая задача.
Run loop сюда не входит, это цикл событий потока, а не очередь. Серийная очередь нужна, чтобы защитить общее состояние без блокировок; при частом чтении берут конкурентную очередь и пишут через флаг .barrier.
Где спотыкаются
Называют глобальные очереди серийными. DispatchQueue.global() конкурентная, и две задачи в ней легко выполнятся одновременно.
Путают серийность с одним потоком. Серийная очередь гарантирует только, что задачи не пересекаются во времени, а выполниться они могут на разных потоках. Поэтому thread-local хранилище и проверки через Thread.current тут не опора.
Вызывают sync на ту же серийную очередь, в которой уже находятся, чаще всего DispatchQueue.main.sync с главного потока. Это дедлок, а не «чуть медленнее».