Middle+
Co se děje s paralelní frontou při spuštění bariérové operace?
sobes.tech AI
Odpověď od AI
Paralelní fronta se dočasně stává sekvenční. Úkoly, které se vykonávají před bariérou, jsou dokončeny, poté se vykoná pouze úkol bariéry. Nové úkoly ne jsou spouštěny, dokud není úkol bariéry dokončen. Po dokončení úkolu bariéry se fronta vrací k paralelnímu provádění zbývajících úkolů.
Příklad použití async/await s bariérou založenou na actor:
actor SharedDataManager {
private var data: [String] = ["Initial"]
func addData(_ item: String) { // Mutující metoda - bariéra
data.append(item)
print("Přidáno \(item). Aktuální data: \(data)")
}
func processData(completion: @escaping ([String]) -> Void) { // Neměnné
// Nevyžaduje bariéru, může být spuštěno paralelně s jinými neměnnými
DispatchQueue.global().async {
// Intenzivní zpracování...
let result = self.data.map { $0.uppercased() }
completion(result)
}
}
func getData() -> [String] { // Neměnná metoda - není bariéra
return data
}
}
Příklad použití Grand Central Dispatch (GCD) s bariérou:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
func performTasks() {
concurrentQueue.async {
print("Úkol 1 začal")
Thread.sleep(forTimeInterval: 1) // Simulace práce
print("Úkol 1 dokončen")
}
concurrentQueue.async {
print("Úkol 2 začal")
Thread.sleep(forTimeInterval: 1)
print("Úkol 2 dokončen")
}
// Úkol bariéry
concurrentQueue.async(flags: .barrier) {
print("Úkol bariéry začal")
Thread.sleep(forTimeInterval: 2) // Simulace práce vyžadující exkluzivní přístup
print("Úkol bariéry dokončen")
}
// Další úkoly
concurrentQueue.async {
print("Úkol 3 začal")
Thread.sleep(forTimeInterval: 1)
print("Úkol 3 dokončen")
}
concurrentQueue.async {
print("Úkol 4 začal")
Thread.sleep(forTimeInterval: 1)
print("Úkol 4 dokončen")
}
}
// Výstup ukáže, že úkoly 3 a 4 začínají až po dokončení úkolu bariéry.