Ответ
Количество потоков (стеков) в программе ограничено системными ресурсами (памятью, лимитами ядра ОС), но на практике их создают десятки или сотни.
Ключевые моменты:
- Главный поток (Main/UI thread): один. Весь UI-код (UIKit/SwiftUI) должен выполняться на нём.
- Фоновые потоки: неограниченное количество, создаваемые через
DispatchQueue,OperationQueueилиThread.
Почему важно ограничивать количество потоков? Создание потока — дорогая операция. Неуправляемое создание ведёт к:
- Overhead контекстных переключений, снижающих производительность.
- Конкуренции за ресурсы (CPU, память).
- Сложности отладки состояний гонки (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) для отслеживания и оптимизации использования потоков.