Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : gcd, concurrency, queue

Что произойдет в параллельной очереди, если запустить на ней барьерную операцию?

Вопрос проверяет понимание работы барьерных задач (Dispatch Barrier) в concurrent очередях Grand Central Dispatch.

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

Когда в concurrent очередь отправляется барьерная задача, очередь временно становится последовательной (serial). Все задачи, которые были добавлены в очередь до барьерной задачи, продолжают выполняться параллельно. Однако барьерная задача начнет выполнение только после завершения всех этих предыдущих задач. Пока выполняется барьерная задача, новые задачи, отправленные в очередь, будут ждать ее завершения.

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

Барьерная задача действует как точка синхронизации в concurrent очереди. Ее основное назначение — обеспечить эксклюзивный доступ к общему ресурсу для операции записи в многопоточном окружении.

Поведение очереди:

  1. До барьера: Задачи, находящиеся в очереди до барьерной, выполняются параллельно, как и ожидается от concurrent очереди.

  2. Во время барьера: Очередь приостанавливает параллельное выполнение. Барьерная задача выполняется одна, монопольно.

  3. После барьера: После завершения барьерной задачи очередь возвращается к обычному параллельному выполнению задач, которые были добавлены после барьера.

Пример использования для чтения/записи:

class ThreadSafeDictionary<Key: Hashable, Value> {
    private var storage = [Key: Value]()
    // Concurrent очередь для эффективного чтения
    private let queue = DispatchQueue(label: "com.example.dictionary.queue", attributes: .concurrent)

    func get(_ key: Key) -> Value? {
        // Чтение может быть параллельным
        return queue.sync {
            return storage[key]
        }
    }

    func set(_ value: Value, for key: Key) {
        // Запись использует барьер для эксклюзивного доступа
        queue.async(flags: .barrier) {
            self.storage[key] = value
        }
    }
}

Важно: Барьерные задачи имеют смысл только в созданных вами concurrent очередях. Использование барьера в глобальной очереди (DispatchQueue.global()) или в последовательной (serial) очереди не имеет эффекта, так как в serial очереди задачи и так выполняются последовательно.

  • Аватар

    iOS Guru

    Roman Isakov

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

Уровень

  • Рейтинг:

    2

  • Сложность:

    7

Навыки

  • Swift

    Swift

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

#gcd

#concurrency

#queue

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

  • Аватар

    iOS Guru

    Roman Isakov

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