Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про IOS: thread, safety, data, race

Как организовать потокобезопасное добавление результатов в общий массив?

опрос проверяет понимание проблем гонок данных и способов защиты общего состояния.

Короткий ответ

Потокобезопасность достигается синхронизацией доступа к массиву. Для этого используют serial queue, barrier или блокировки. Нельзя одновременно изменять массив из разных потоков без защиты. Самый простой способ — выполнять все изменения через одну очередь.

Длинный ответ

Массивы в Swift не являются потокобезопасными. Если несколько потоков одновременно изменяют один массив, возникает гонка данных.

Основной подход

Обычно создается отдельная очередь, отвечающая за доступ к данным:

let syncQueue = DispatchQueue(label: "sync.queue")
var results: [Int] = []

Добавление выполняется так:

syncQueue.async {
    results.append(1)
}

Использование barrier

При concurrent-очереди можно применять barrier:

let queue = DispatchQueue(label: "queue", attributes: .concurrent)

queue.async(flags: .barrier) {
    results.append(1)
}

Альтернативные варианты

Также используются:

  • NSLock

  • DispatchSemaphore

  • actor в Swift Concurrency

Вывод

Самый читаемый и безопасный способ — сериализовать доступ к общему массиву через отдельную очередь.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • IOS

    IOS

Ключевые слова

#thread

#safety

#data

#race

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.