> Как сделать потокобезопасным общий массив при синхронных операциях в concurrent очереди (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Московская биржа
Стек: iOS, Swift
> Пример ответа
Для обеспечения потокобезопасности общего массива при синхронных операциях в concurrent очереди в Swift можно использовать комбинацию барьерных операций (barrier flags) и concurrent очереди. Это позволяет одновременно читать данные из массива (без блокировок) и сериализовать запись (чтобы избежать гонки данных).
Пример реализации:
SWIFTclass ThreadSafeArray<T> {private var array: [T] = []private let queue = DispatchQueue(label: "com.example.threadsafe", attributes: .concurrent)// Чтение - concurrent, без блокировкиvar count: Int {return queue.sync { array.count }}// Запись - с барьером, эксклюзивноfunc append(_ element: T) {queue.async(flags: .barrier) {self.array.append(element)}}// Доступ по индексу - синхронное чтениеsubscript(index: Int) -> T? {return queue.sync {guard index < array.count else { return nil }return array[index]}}// Удаление - с барьеромfunc remove(at index: Int) {queue.async(flags: .barrier) {guard index < self.array.count else { return }self.array.remove(at: index)}}}
Ключевые моменты:
queue.syncдля чтения - потокобезопасно, так как операции выполняются последовательно в очереди, но concurrent-атрибут позволяет параллельно выполнять несколько чтений.queue.async(flags: .barrier)для записи - барьер гарантирует, что все предыдущие операции (включая чтения) завершатся до начала записи, и никакие другие операции не начнутся, пока запись не закончится.- Такой подход эффективнее, чем использование
NSLockили сериализованной очереди, так как чтения не блокируют друг друга.
Важно: Все публичные методы должны использовать queue.sync или queue.async(flags: .barrier), чтобы избежать прямого доступа к массиву извне.
> Похожие задачи по mobile
Всегда ли структуры хранятся в стеке
Как написать структуру или класс для бинарного дерева поиска
Что такое сайд таблица (side table) в контексте weak ссылок и как она работает
Как реализовать функцию умножения числа на десять с обработкой символов
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью