Middle+
Kas vyksta su paraleline eile pradėjus barjerinę operaciją?
sobes.tech AI
Atsakymas iš AI
Lygiagretus eilė laikinai tampa seka. Iki barjero vykdomos užduotys baigiamos, tada vykdoma tik barjero užduotis. Naujos užduotys ne pradeda veikti iki barjero pabaigos. Po barjero užduoties pabaigos eilė atnaujina lygiagretį vykdymą likusioms užduotims.
Pavyzdys naudojant async/await su barjeru actor pagrindu:
actor SharedDataManager {
private var data: [String] = ["Initial"]
func addData(_ item: String) { // Mutuojanti funkcija - barjeras
data.append(item)
print("Pridėta \(item). Dabartiniai duomenys: \(data)")
}
func processData(completion: @escaping ([String]) -> Void) { // Nemutuojanti
// Nereikalauja barjero, gali būti vykdoma lygiagrečiai su kitomis nemutuojančiomis
DispatchQueue.global().async {
// Intensyvus apdorojimas...
let result = self.data.map { $0.uppercased() }
completion(result)
}
}
func getData() -> [String] { // Nemutuojanti funkcija - ne barjeras
return data
}
}
Pavyzdys naudojant Grand Central Dispatch (GCD) su barjeru:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
func performTasks() {
concurrentQueue.async {
print("Užduotis 1 pradėta")
Thread.sleep(forTimeInterval: 1) // Imituoja darbą
print("Užduotis 1 baigta")
}
concurrentQueue.async {
print("Užduotis 2 pradėta")
Thread.sleep(forTimeInterval: 1)
print("Užduotis 2 baigta")
}
// Barjerinė užduotis
concurrentQueue.async(flags: .barrier) {
print("Barjerinė užduotis pradėta")
Thread.sleep(forTimeInterval: 2) // Imituoja darbą, reikalaujantį išskirtinio prieigos
print("Barjerinė užduotis baigta")
}
concurrentQueue.async {
print("Užduotis 3 pradėta")
Thread.sleep(forTimeInterval: 1)
print("Užduotis 3 baigta")
}
concurrentQueue.async {
print("Užduotis 4 pradėta")
Thread.sleep(forTimeInterval: 1)
print("Užduotis 4 baigta")
}
}
// Rezultatas parodys, kad užduotys Task 3 ir Task 4 prasideda tik po Barjerinės užduoties pabaigos.