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.