Что такое многопоточность
Что проверяют
Понимаете ли вы, зачем она нужна в мобильном приложении, и знаете ли главное правило.
Как отвечать
Многопоточность это выполнение нескольких участков кода параллельно или с чередованием. В приложении для устройства она нужна по двум причинам.
Первая и главная: не блокировать главный поток. На отрисовку кадра есть примерно шестнадцать миллисекунд. Всё, что дольше, немедленно превращается в подвисание: интерфейс перестаёт отвечать, прокрутка дёргается. Поэтому сеть, работа с диском, разбор больших данных и обработка изображений уходят с главного потока.
Вторая: использовать несколько ядер для вычислений.
Обратная сторона обязательна: интерфейс трогает только главный поток. Обновление элементов из фонового потока даёт неопределённое поведение и падения, и это первое правило платформы.
Инструменты, от современного к старому:
- структурированная конкурентность с асинхронными функциями, задачами и акторами. Ожидание здесь приостанавливает задачу, а не блокирует поток, поэтому пул потоков не разрастается. Акторы изолируют изменяемое состояние по построению, и гонки исключаются не дисциплиной, а языком;
- очереди диспетчеризации: последовательные и конкурентные, барьеры, группы, семафоры;
- очередь операций там, где нужны зависимости между задачами, отмена и приоритеты;
- потоки напрямую почти не используются в прикладном коде.
Проблемы, которые надо назвать: гонки за общими данными, взаимные блокировки (классика это синхронный вызов на текущую последовательную очередь), инверсия приоритетов и разрастание пула потоков при множестве блокирующих операций.
Инструменты поиска: анализатор потоков и проверка главного потока в схеме сборки. Оба ловят реальные ошибки, которые иначе воспроизводятся раз в месяц у пользователей.
Где спотыкаются
Обновляют интерфейс из фонового потока.
Вызывают синхронную отправку на главную очередь и получают зависание.
Смешивают семафоры со структурированной конкурентностью, блокируя потоки.
Не включают анализатор потоков и не находят гонки.