Middle+
Šta se dešava sa paralelnom redom kada se pokrene barijerska operacija?
sobes.tech АИ
Одговор од АИ
Paralelna red čekanja privremeno postaje sekvencijalna. Zadaci koji se izvršavaju pre barijere se završavaju, zatim se izvršava samo zadatak barijere. Novi zadaci ne počinju dok se zadatak barijere ne završi. Nakon završetka zadatka barijere, red se vraća na paralelno izvršavanje za preostale zadatke.
Primer korišćenja async/await sa barijerom zasnovanom na actor:
actor SharedDataManager {
private var data: [String] = ["Initial"]
func addData(_ item: String) { // Mutabilni metod - barijera
data.append(item)
print("Dodat \(item). Trenutni podaci: \(data)")
}
func processData(completion: @escaping ([String]) -> Void) { // Nemutabilno
// Ne zahteva barijeru, može se izvršavati paralelno sa drugim nemutabilnim
DispatchQueue.global().async {
// Intenzivna obrada...
let result = self.data.map { $0.uppercased() }
completion(result)
}
}
func getData() -> [String] { // Nemutabilna metoda - ne barijera
return data
}
}
Primer korišćenja Grand Central Dispatch (GCD) sa barijerom:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
func performTasks() {
concurrentQueue.async {
print("Zadatak 1 počeo")
Thread.sleep(forTimeInterval: 1) // Simulacija rada
print("Zadatak 1 završio")
}
concurrentQueue.async {
print("Zadatak 2 počeo")
Thread.sleep(forTimeInterval: 1)
print("Zadatak 2 završio")
}
// Zadatak barijere
concurrentQueue.async(flags: .barrier) {
print("Zadatak barijere počeo")
Thread.sleep(forTimeInterval: 2) // Simulacija rada koji zahteva ekskluzivan pristup
print("Zadatak barijere završio")
}
// Ostali zadaci
concurrentQueue.async {
print("Zadatak 3 počeo")
Thread.sleep(forTimeInterval: 1)
print("Zadatak 3 završio")
}
concurrentQueue.async {
print("Zadatak 4 počeo")
Thread.sleep(forTimeInterval: 1)
print("Zadatak 4 završio")
}
}
// Izlaz će pokazati da zadaci 3 i 4 počinju tek nakon završetka zadatka barijere.