С какими проблемами можно столкнуться при работе с GCD

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

Ответ

При работе с Grand Central Dispatch (GCD) можно столкнуться с несколькими типичными проблемами:

  1. Deadlock – когда очередь ожидает саму себя (например, вызов sync на текущей очереди):
DispatchQueue.main.sync { // Deadlock!
    print("This will never execute")
}
  1. Приоритетная инверсия – низкоприоритетная задача блокирует высокоприоритетную.

  2. Race conditions – гонки данных при отсутствии синхронизации:

var counter = 0
DispatchQueue.concurrentPerform(iterations: 100) { _ in
    counter += 1 // Небезопасно!
}
  1. Утечки ресурсов – забытые dispatch sources или неправильно настроенные таймеры.

  2. Чрезмерное создание потоков – при использовании многих concurrent очередей система может создать избыточное количество потоков.

  3. Неправильный выбор очереди – выполнение UI-работы не на main queue.

Для избежания проблем используйте:

  • DispatchQueue.main для UI
  • Thread sanitizer для обнаружения гонок
  • Аккуратно работайте с sync вызовами
  • Используйте DispatchSemaphore или NSLock для синхронизации