Sobes.tech
Middle+

¿Qué sucede con la cola paralela al iniciar una operación de barrera?

sobes.tech AI

Respuesta de la IA

La cola paralela se convierte temporalmente en una cola secuencial. Las tareas que se ejecutan antes de la barrera finalizan, y luego solo se ejecuta la tarea de barrera. Las nuevas tareas no se inician hasta que la tarea de barrera termina. Después de que la tarea de barrera finaliza, la cola vuelve a un modo de ejecución paralela para las tareas restantes.

Ejemplo de uso de async/await con una barrera basada en actor:

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

    func addData(_ item: String) { // Método mutable - barrera
        data.append(item)
        print("Added \(item). Current data: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // No mutable
        // No requiere barrera, puede ejecutarse en paralelo con otros no mutables
        DispatchQueue.global().async {
            // Procesamiento intensivo...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Método no mutable - no barrera
        return data
    }
}

Ejemplo de uso de Grand Central Dispatch (GCD) con una barrera:

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

func performTasks() {
    concurrentQueue.async {
        print("Tarea 1 iniciada")
        Thread.sleep(forTimeInterval: 1) // Simulación de trabajo
        print("Tarea 1 finalizada")
    }

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

    // Tarea de barrera
    concurrentQueue.async(flags: .barrier) {
        print("Tarea de barrera iniciada")
        Thread.sleep(forTimeInterval: 2) // Simulación de trabajo que requiere acceso exclusivo
        print("Tarea de barrera finalizada")
    }

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

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

// La salida mostrará que las tareas 3 y 4 comienzan solo después de que la tarea de barrera termina.