Какие примитивы синхронизации существуют и как они работают
асинхронностьмногопоточностьпримитивы синхронизациипроизводительностьсинхронизация
Что проверяют
Знаете ли вы набор инструментов iOS и понимаете ли, что современный ответ это акторы, а не блокировки.
Как отвечать
По уровням.
Низкий уровень:
NSLockиNSRecursiveLock: обычная и рекурсивная блокировки;os_unfair_lock: самый дешёвый вариант, но требует аккуратности с указателями и не реентрантный.OSSpinLockустарел из-за проблемы приоритетной инверсии;pthread_mutex: если нужен точный контроль;- атомарные операции из
Atomics.
GCD:
- последовательная очередь как замена блокировке: доступ к состоянию только через неё;
- барьер в конкурентной очереди для схемы «много читателей, один писатель»;
DispatchSemaphore: ограничение числа одновременных операций, а также ожидание завершения;DispatchGroup: дождаться нескольких задач.
Swift Concurrency (современный ответ):
- актор изолирует своё состояние: обращения к нему сериализуются автоматически, и гонки исключены по построению, а не дисциплиной;
@MainActorпривязывает код к главному потоку;Sendableи строгая проверка конкурентности переносят часть ошибок с рантайма на компиляцию.
Практика: в новом коде брать акторы. Блокировки остаются для взаимодействия со старым кодом и для точечных горячих мест.
Где спотыкаются
Используют DispatchSemaphore для ожидания асинхронного результата и получают взаимную блокировку.
Считают @objc свойства с атрибутом atomic потокобезопасными: атомарен доступ, а не последовательность операций.
Захватывают нереентрантную блокировку повторно.
Не знают про акторы и решают задачу изоляции вручную.