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

Параллельная очередь временно становится последовательной.

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

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Пример использования async/await с барьером на основе actor:

actor SharedDataManager {
    private var data: [String] = ["Initial"]

    func addData(_ item: String) { // Мутирующий метод - барьер
        data.append(item)
        print("Added \(item). Current data: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Немутирующий
        // Не требует барьера, может выполняться параллельно другим немутирующим
        DispatchQueue.global().async {
            // Интенсивная обработка...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Немутирующий метод - не барьер
        return data
    }
}

Пример использования Grand Central Dispatch (GCD) с барьером:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

func performTasks() {
    concurrentQueue.async {
        print("Task 1 started")
        Thread.sleep(forTimeInterval: 1) // Имитация работы
        print("Task 1 finished")
    }

    concurrentQueue.async {
        print("Task 2 started")
        Thread.sleep(forTimeInterval: 1)
        print("Task 2 finished")
    }

    // Барьерная задача
    concurrentQueue.async(flags: .barrier) {
        print("Barrier task started")
        Thread.sleep(forTimeInterval: 2) // Имитация работы, требующей эксклюзивного доступа
        print("Barrier task finished")
    }

    concurrentQueue.async {
        print("Task 3 started")
        Thread.sleep(forTimeInterval: 1)
        print("Task 3 finished")
    }

    concurrentQueue.async {
        print("Task 4 started")
        Thread.sleep(forTimeInterval: 1)
        print("Task 4 finished")
    }
}

// Output будет показывать, что Task 3 и Task 4 начинаются только после завершения Barrier task.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее