> Как сделать потокобезопасным общий массив при синхронных операциях в concurrent очереди (iOS, Swift)

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

Компании: Московская биржа

Стек: iOS, Swift

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

Для обеспечения потокобезопасности общего массива при синхронных операциях в concurrent очереди в Swift можно использовать комбинацию барьерных операций (barrier flags) и concurrent очереди. Это позволяет одновременно читать данные из массива (без блокировок) и сериализовать запись (чтобы избежать гонки данных).

Пример реализации:

SWIFT
class 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), чтобы избежать прямого доступа к массиву извне.

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

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