Sobes.tech
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.