Middle+
Bariyer işlemi başlatıldığında paralel kuyrukta ne olur?
sobes.tech yapay zeka
AI'dan gelen yanıt
Paralel kuyruk geçici olarak sıralı hale gelir. Barajdan önceki yürütülen görevler tamamlanır, ardından yalnızca baraj görevi yürütülür. Yeni görevler başlatılmaz ta ki baraj görevi tamamlanana kadar. Baraj görevi tamamlandıktan sonra kuyruk kalan görevler için paralel yürütmeye devam eder.
async/await kullanımıyla actor tabanlı bir baraj örneği:
actor SharedDataManager {
private var data: [String] = ["Initial"]
func addData(_ item: String) { // Değiştirici metod - baraj
data.append(item)
print("Eklendi \(item). Güncel veri: \(data)")
}
func processData(completion: @escaping ([String]) -> Void) { // Değiştirmeyen
// Baraj gerekmez, diğer değiştirilmeyenlerle paralel olarak çalışabilir
DispatchQueue.global().async {
// Yoğun işlem...
let result = self.data.map { $0.uppercased() }
completion(result)
}
}
func getData() -> [String] { // Değiştirmeyen metod - baraj değil
return data
}
}
Grand Central Dispatch (GCD) kullanımıyla baraj örneği:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
func performTasks() {
concurrentQueue.async {
print("Görev 1 başladı")
Thread.sleep(forTimeInterval: 1) // İşlem simülasyonu
print("Görev 1 bitti")
}
concurrentQueue.async {
print("Görev 2 başladı")
Thread.sleep(forTimeInterval: 1)
print("Görev 2 bitti")
}
// Baraj görevi
concurrentQueue.async(flags: .barrier) {
print("Baraj görevi başladı")
Thread.sleep(forTimeInterval: 2) // Erişim gerektiren işlem
print("Baraj görevi bitti")
}
concurrentQueue.async {
print("Görev 3 başladı")
Thread.sleep(forTimeInterval: 1)
print("Görev 3 bitti")
}
concurrentQueue.async {
print("Görev 4 başladı")
Thread.sleep(forTimeInterval: 1)
print("Görev 4 bitti")
}
}
// Çıktı, Görev 3 ve Görev 4'ün yalnızca Baraj görevi tamamlandıktan sonra başladığını gösterecek.