> Что такое concurrent queue в GCD? (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: VK

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Concurrent queue в GCD - это очередь, которая выполняет задачи одновременно, в порядке их добавления, но не гарантирует завершение одной задачи до начала другой. Задачи запускаются последовательно, но могут выполняться параллельно на разных потоках. В Swift создаётся через DispatchQueue(label:attributes: .concurrent). Concurrent queue позволяет эффективно использовать многоядерные процессоры для независимых задач, но требует осторожности при работе с общими данными.

Подробное объяснение

Concurrent queue - одна из двух основных типов очередей в Grand Central Dispatch наряду с serial queue. Основное отличие: serial queue выполняет задачи строго по одной, а concurrent queue может запускать несколько задач одновременно.

GCD управляет пулом потоков, и concurrent queue распределяет задачи по доступным потокам. Порядок запуска задач соответствует порядку их добавления, но время завершения может быть любым. Это важно: если задача B добавлена после задачи A, она может завершиться раньше.

Concurrent queue бывают двух видов:

  • глобальные, предоставляемые системой через DispatchQueue.global(qos:) с разными уровнями приоритета (userInteractive, userInitiated, utility, background);
  • пользовательские, создаваемые через DispatchQueue(label:attributes: .concurrent).

Для синхронизации доступа к общим ресурсам часто используют барьеры (barrier), которые позволяют временно сделать concurrent queue последовательной для определённой задачи.

На практике

Concurrent queue применяют для параллельного выполнения независимых операций: загрузка нескольких изображений, обработка больших массивов данных, выполнение сетевых запросов. Главное правило - задачи не должны иметь общих изменяемых данных без дополнительной синхронизации.

При работе с UI важно помнить: обновление интерфейса всегда должно происходить на главной очереди, даже если задача выполняется на concurrent queue.

Также стоит учитывать, что concurrent queue не гарантирует ускорение - если задачи слишком маленькие, накладные расходы на переключение контекста могут превысить выгоду от параллелизма.

Пример кода

SWIFT
let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
concurrentQueue.async {
print("Задача 1 на потоке: \(Thread.current)")
}
concurrentQueue.async {
print("Задача 2 на потоке: \(Thread.current)")
}
concurrentQueue.async {
print("Задача 3 на потоке: \(Thread.current)")
}
// Использование барьера для безопасной записи
concurrentQueue.async(flags: .barrier) {
print("Барьер: эксклюзивная задача")
}

Как отвечать на собеседовании

Начни с простого определения, затем покажи понимание ключевых свойств: параллельное выполнение, отсутствие гарантии порядка завершения, отличие от serial queue. Упомяни глобальные и пользовательские concurrent queue, а также уровни QoS. Хорошо добавить пример использования барьера - это покажет знание продвинутых техник. Заверши практическим советом: concurrent queue подходит для независимых задач, но требует синхронизации при работе с общими данными.

Что проверяет интервьюер

Интервьюер оценивает базовое понимание многопоточности в iOS: знает ли кандидат разницу между serial и concurrent, понимает ли, что порядок завершения не гарантирован, осознаёт ли риски гонки данных. Также проверяется знание API: DispatchQueue, attributes: .concurrent, async, barrier. Для junior уровня достаточно уверенного ответа на 1-2 минуты с примером.

Типичные ошибки

  • утверждение, что concurrent queue выполняет задачи строго в порядке добавления - это неверно, гарантирован только порядок запуска;
  • игнорирование проблем синхронизации при работе с общими переменными;
  • обновление UI с concurrent queue без переключения на main queue;
  • создание concurrent queue для задач, которые не выигрывают от параллелизма (например, слишком мелких);
  • путаница между sync и async при работе с concurrent queue - sync блокирует вызывающий поток, что может привести к deadlock.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью