Сколько стеков (threads) может быть в программе?

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

Ответ

Количество потоков (стеков) в программе ограничено системными ресурсами (памятью, лимитами ядра ОС), но на практике их создают десятки или сотни.

Ключевые моменты:

  • Главный поток (Main/UI thread): один. Весь UI-код (UIKit/SwiftUI) должен выполняться на нём.
  • Фоновые потоки: неограниченное количество, создаваемые через DispatchQueue, OperationQueue или Thread.

Почему важно ограничивать количество потоков? Создание потока — дорогая операция. Неуправляемое создание ведёт к:

  1. Overhead контекстных переключений, снижающих производительность.
  2. Конкуренции за ресурсы (CPU, память).
  3. Сложности отладки состояний гонки (race conditions).

Best Practice: Используйте Grand Central Dispatch (GCD) или OperationQueue, которые управляют пулом потоков за вас, переиспользуя их.

// Пример создания фонового потока через GCD
DispatchQueue.global(qos: .userInitiated).async {
    // Выполнение тяжелой задачи (например, обработка изображения)
    let result = processImage()

    // Возврат результата в главный поток для обновления UI
    DispatchQueue.main.async {
        self.imageView.image = result
    }
}

// Проверка текущего потока
if Thread.isMainThread {
    print("Выполняется на главном потоке")
}

Используйте инструменты профилирования (Instruments, Thread Sanitizer) для отслеживания и оптимизации использования потоков.