> Какие способы борьбы с data race существуют (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Aston

Стек: iOS, Swift

> Пример ответа

В Swift и iOS-разработке основные способы борьбы с data race включают:

  1. Сериализация доступа через GCD - использование последовательных очередей (DispatchQueue(label: "serial")) или барьерных операций на конкурентных очередях (queue.async(flags: .barrier)). Это гарантирует, что к общим данным обращается только один поток в момент записи.

  2. Блокировки (locks) - NSLock, os_unfair_lock или pthread_mutex. Обеспечивают взаимное исключение, но требуют аккуратности, чтобы избежать deadlock.

  3. Атомарные свойства - atomic в Objective-C (недоступно напрямую в Swift). В Swift можно использовать os_unfair_lock или Atomic из библиотек (например, Atomics в Swift 5.5+).

  4. Изоляция через акторы (actors) - современный подход в Swift 5.5+ (Swift Concurrency). Акторы автоматически защищают своё состояние, обеспечивая последовательный доступ к своим свойствам и методам. Пример: actor Counter { var value = 0 }.

  5. Value semantics (структуры) - использование структур вместо классов, так как они передаются по значению. Каждый поток получает свою копию, что исключает гонки, но требует осторожности с ссылочными типами внутри.

  6. Immutable данные - проектирование с неизменяемыми объектами. После создания данные не меняются, поэтому гонки невозможны.

  7. Thread-local storage - хранение данных, специфичных для потока (например, через Thread.current.threadDictionary).

На практике в iOS-проектах чаще всего комбинируют акторы (для нового кода) и сериализованные очереди (для legacy).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью