Middle+
Čo sa deje s paralelným frontom pri spustení bariérových operácií?
sobes.tech AI
Odpoveď od AI
Paralelné fronty sa dočasne stávajú sekvenčnými. Úlohy vykonávané pred bariérou sa dokončia, potom sa vykoná iba bariérová úloha. Nové úlohy sa nespúšťajú pred dokončením bariéry. Po dokončení bariérovéj úlohy sa fronta obnoví na paralelné vykonávanie zostávajúcich úloh.
Príklad použitia async/await s bariérou na základe actor:
actor SharedDataManager {
private var data: [String] = ["Initial"]
func addData(_ item: String) { // Mutujúca metóda - bariéra
data.append(item)
print("Pridané \(item). Aktuálne dáta: \(data)")
}
func processData(completion: @escaping ([String]) -> Void) { // Nemutujúca
// Nevyžaduje bariéru, môže bežať paralelne s inými nemutujúcimi
DispatchQueue.global().async {
// Intenzívne spracovanie...
let result = self.data.map { $0.uppercased() }
completion(result)
}
}
func getData() -> [String] { // Nemutujúca metóda - nie bariéra
return data
}
}
Príklad použitia Grand Central Dispatch (GCD) s bariérou:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
func performTasks() {
concurrentQueue.async {
print("Úloha 1 začala")
Thread.sleep(forTimeInterval: 1) // Napodobnenie práce
print("Úloha 1 skončila")
}
concurrentQueue.async {
print("Úloha 2 začala")
Thread.sleep(forTimeInterval: 1)
print("Úloha 2 skončila")
}
// Bariérová úloha
concurrentQueue.async(flags: .barrier) {
print("Bariérová úloha začala")
Thread.sleep(forTimeInterval: 2) // Napodobnenie práce vyžadujúcej exkluzívny prístup
print("Bariérová úloha skončila")
}
concurrentQueue.async {
print("Úloha 3 začala")
Thread.sleep(forTimeInterval: 1)
print("Úloha 3 skončila")
}
concurrentQueue.async {
print("Úloha 4 začala")
Thread.sleep(forTimeInterval: 1)
print("Úloha 4 skončila")
}
}
// Výstup bude ukazovať, že úlohy Task 3 a Task 4 začínajú až po dokončení bariérovéj úlohy.