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.