> Что происходит при состояниях гонки, дедлоках, инверсии приоритетов, взрыве потоков, голодании и лайфлоке (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Bip.ru
Стек: iOS, Swift
> Пример ответа
При состояниях гонки (race condition) несколько потоков одновременно обращаются к общим данным без синхронизации, что приводит к непредсказуемым результатам - например, два потока могут одновременно прочитать и изменить одно значение, и финальный результат зависит от порядка выполнения. В iOS это часто проявляется при работе с UI из фоновых потоков или при конкурентном доступе к моделям данных.
Дедлок (deadlock) возникает, когда два или более потоков блокируют друг друга, ожидая освобождения ресурсов, которые удерживаются другими потоками. Например, поток A захватил блокировку 1 и ждет блокировку 2, а поток B захватил блокировку 2 и ждет блокировку 1. В Swift это может случиться при неправильном использовании NSLock или DispatchQueue.sync с вложенными вызовами.
Инверсия приоритетов (priority inversion) - это ситуация, когда низкоприоритетный поток удерживает ресурс, необходимый высокоприоритетному потоку, из-за чего высокоприоритетный поток вынужден ждать. В iOS это решается через QoS (Quality of Service) и механизмы, такие как priority inheritance в os_unfair_lock.
Взрыв потоков (thread explosion) происходит, когда система создает слишком много потоков, что приводит к истощению ресурсов (память, контекстное переключение). В iOS это часто связано с неправильным использованием DispatchQueue.concurrentPerform или созданием большого количества OperationQueue без ограничений.
Голодание (starvation) - поток не получает доступа к ресурсу, потому что другие потоки постоянно его опережают. Например, в очереди с высоким приоритетом низкоприоритетные задачи могут никогда не выполниться. В GCD это решается правильной настройкой QoS и избеганием бесконечных циклов с высоким приоритетом.
Лайфлок (livelock) - потоки не заблокированы, но постоянно меняют свое состояние в ответ на действия друг друга, не выполняя полезной работы. Например, два потока пытаются освободить ресурс, но каждый раз, видя, что другой тоже пытается, отступают и повторяют попытку. В iOS это может произойти при неправильной реализации алгоритмов с повторными попытками без задержек.
> Похожие задачи по mobile
Использовали ли паттерны Router и Coordinator
Из чего состоит HTTP запрос
Может ли дедлок возникать между задачами на разных очередях
Как организовать сетевые вызовы в iOS проекте
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью