Какие инструменты для многопоточности используются в iOS?
Что проверяют
Знаете ли вы весь набор и понимаете ли, что современный выбор это структурированная конкурентность.
Как отвечать
По поколениям, от современного к низкоуровневому.
Swift Concurrency это основной инструмент для нового кода:
asyncиawaitдля асинхронных функций;Taskдля запуска работы, группы задач для параллельного выполнения нескольких операций с ожиданием всех;- акторы изолируют изменяемое состояние: обращения к нему сериализуются автоматически, поэтому гонки исключены по построению, а не дисциплиной;
@MainActorпривязывает код к главному потоку;Sendableи строгая проверка конкурентности переносят часть ошибок с рантайма на компиляцию;- асинхронные последовательности для потоков значений.
Главное отличие от старых средств: ожидание приостанавливает задачу, а не блокирует поток, поэтому разрастания пула потоков не происходит.
GCD остаётся для взаимодействия со старым кодом и точечных задач: очереди последовательные и конкурентные, асинхронная и синхронная отправка, барьеры для схемы «много читателей, один писатель», группы для ожидания нескольких задач, семафоры для ограничения одновременности, источники событий для таймеров.
OperationQueue и операции: уровень выше GCD. Даёт зависимости между задачами, отмену, приоритеты и ограничение числа одновременных операций. Там, где нужен граф зависимостей, он до сих пор удобнее.
Thread и pthread: низкий уровень, в прикладном коде почти не встречаются.
Combine решает смежную задачу: реактивные потоки значений с планировщиками.
Примитивы синхронизации: блокировки для точечных мест, а спин-блокировка устарела из-за проблемы инверсии приоритетов.
Правило выбора: новый код на структурированной конкурентности, GCD там, где надо состыковаться со старым, очередь операций при сложных зависимостях.
Где спотыкаются
Смешивают семафоры GCD с асинхронными функциями и блокируют поток.
Вызывают синхронную отправку на главную очередь и получают зависание.
Не знают про акторы и синхронизируют состояние вручную.
Плодят очереди, вызывая разрастание пула потоков.