Sobes.tech
Middle+

O que acontece com a fila paralela ao iniciar uma operação de barreira?

sobes.tech IA

Resposta da IA

A fila paralela torna-se temporariamente uma fila sequencial. As tarefas em execução antes da barreira terminam, e então apenas a tarefa de barreira é executada. Novas tarefas não são iniciadas até que a tarefa de barreira seja concluída. Após a conclusão da tarefa de barreira, a fila retoma a execução paralela para as tarefas restantes.

Exemplo de uso de async/await com uma barreira baseada em actor:

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

    func addData(_ item: String) { // Método mutável - barreira
        data.append(item)
        print("Adicionado \(item). Dados atuais: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Não mutável
        // Não requer barreira, pode ser executado em paralelo com outros não mutáveis
        DispatchQueue.global().async {
            // Processamento intensivo...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Método não mutável - não é barreira
        return data
    }
}

Exemplo de uso do Grand Central Dispatch (GCD) com uma barreira:

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

func performTasks() {
    concurrentQueue.async {
        print("Tarefa 1 iniciada")
        Thread.sleep(forTimeInterval: 1) // Simulação de trabalho
        print("Tarefa 1 finalizada")
    }

    concurrentQueue.async {
        print("Tarefa 2 iniciada")
        Thread.sleep(forTimeInterval: 1)
        print("Tarefa 2 finalizada")
    }

    // Tarefa de barreira
    concurrentQueue.async(flags: .barrier) {
        print("Tarefa de barreira iniciada")
        Thread.sleep(forTimeInterval: 2) // Simulação de trabalho que requer acesso exclusivo
        print("Tarefa de barreira finalizada")
    }

    concurrentQueue.async {
        print("Tarefa 3 iniciada")
        Thread.sleep(forTimeInterval: 1)
        print("Tarefa 3 finalizada")
    }

    concurrentQueue.async {
        print("Tarefa 4 iniciada")
        Thread.sleep(forTimeInterval: 1)
        print("Tarefa 4 finalizada")
    }
}

// A saída mostrará que as tarefas 3 e 4 começam apenas após a conclusão da tarefa de barreira.