Синхронный доступ к состоянию без очереди
Вопрос
Нужно защитить счётчик, который читают и пишут из разных потоков синхронного кода, с минимальными накладными расходами. Что подходит лучше всего на iOS 18+?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
DispatchSemaphore(value: 1)вокруг доступаDispatchQueue.main.syncдля каждого доступа- Пометить свойство
volatile, как в C Mutexиз Synchronization (iOS 18)правильный ответ
Разбор
Mutex (Swift 6, iOS 18) и OSAllocatedUnfairLock это лёгкие блокировки без переключения очередей, к тому же они поддерживают приоритетное наследование, в отличие от семафора, который не знает владельца и подвержен инверсии приоритетов. main.sync из фона медленно и грозит deadlock, а с главного потока сразу deadlock. Ключевого слова volatile в Swift нет. Если код асинхронный, естественный выбор это актор.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «GCD и OperationQueue»
- Асинхронная Operation
- Барьер для потокобезопасного кеша
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- Как дождаться нескольких запросов в GCD
- Задача на Swift: операции с зависимостями и критический путь
- Задача на Swift: OperationQueue с ограничением параллельности