Выбор ответа Senior GCD и OperationQueue обновлено

Синхронный доступ к состоянию без очереди

Вопрос

Нужно защитить счётчик, который читают и пишут из разных потоков синхронного кода, с минимальными накладными расходами. Что подходит лучше всего на iOS 18+?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Mutex из Synchronization (iOS 18). Mutex (Swift 6, iOS 18) и OSAllocatedUnfairLock это лёгкие блокировки без переключения очередей, к тому же они поддерживают приоритетное наследование, в отличие от семафора, который не знает владельца и подвержен инверсии приоритетов.…

Варианты ответа

  1. DispatchSemaphore(value: 1) вокруг доступа
  2. DispatchQueue.main.sync для каждого доступа
  3. Пометить свойство volatile, как в C
  4. Mutex из Synchronization (iOS 18)правильный ответ

Разбор

Mutex (Swift 6, iOS 18) и OSAllocatedUnfairLock это лёгкие блокировки без переключения очередей, к тому же они поддерживают приоритетное наследование, в отличие от семафора, который не знает владельца и подвержен инверсии приоритетов. main.sync из фона медленно и грозит deadlock, а с главного потока сразу deadlock. Ключевого слова volatile в Swift нет. Если код асинхронный, естественный выбор это актор.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме