Middle+
Ce se întâmplă cu coada paralelă la pornirea unei operații de barieră?
sobes.tech AI
Răspuns de la AI
Coada paralelă devine temporar o coadă secvențială. Task-urile care rulează înainte de barier se finalizează, apoi se execută doar task-ul de barier. Task-urile noi nu încep până când task-ul de barier nu se finalizează. După finalizarea task-ului de barier, coada reia execuția paralelă pentru task-urile rămase.
Exemplu de utilizare a async/await cu o barieră bazată pe actor:
actor SharedDataManager {
private var data: [String] = ["Initial"]
func addData(_ item: String) { // Metodă mutabilă - barieră
data.append(item)
print("Adăugat \(item). Datele curente: \(data)")
}
func processData(completion: @escaping ([String]) -> Void) { // Non mutabil
// Nu necesită barieră, poate fi executat în paralel cu alte non mutabile
DispatchQueue.global().async {
// Procesare intensă...
let result = self.data.map { $0.uppercased() }
completion(result)
}
}
func getData() -> [String] { // Metodă non mutabilă - nu barieră
return data
}
}
Exemplu de utilizare a Grand Central Dispatch (GCD) cu o barieră:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
func performTasks() {
concurrentQueue.async {
print("Task 1 început")
Thread.sleep(forTimeInterval: 1) // Simulare de lucru
print("Task 1 terminat")
}
concurrentQueue.async {
print("Task 2 început")
Thread.sleep(forTimeInterval: 1)
print("Task 2 terminat")
}
// Task de barieră
concurrentQueue.async(flags: .barrier) {
print("Task de barieră început")
Thread.sleep(forTimeInterval: 2) // Simulare de lucru care necesită acces exclusiv
print("Task de barieră terminat")
}
// Alte task-uri
concurrentQueue.async {
print("Task 3 început")
Thread.sleep(forTimeInterval: 1)
print("Task 3 terminat")
}
concurrentQueue.async {
print("Task 4 început")
Thread.sleep(forTimeInterval: 1)
print("Task 4 terminat")
}
}
// Output-ul va arăta că Task 3 și Task 4 încep doar după ce Task-ul de barieră s-a încheiat.