Sobes.tech
Middle+

Barier əməliyyatı başladıqda paralel növbədə nə baş verir?

sobes.tech Süni İntellekt

AI-dan cavab

Paralel növbə müvəqqəti olaraq ardıcıl növbəyə çevrilir. Barrierdən əvvəl yerinə yetirilən tapşırıqlar tamamlanır, sonra yalnız barrier tapşırığı icra olunur. Yeni tapşırıqlar başladılmır barrier tapşırığı tamamlanana qədər. Barrier tapşırığı tamamlandıqdan sonra növbə qalan tapşırıqlar üçün paralel icraya davam edir.

async/await istifadə nümunəsi ilə actor əsaslı barrier:

actor SharedDataManager {
    private var data: [String] = ["Initial"]

    func addData(_ item: String) { // Dəyişdirici metod - barrier
        data.append(item)
        print("Əlavə olundu \(item). Mövcud məlumatlar: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Dəyişdirilməz
        // Barrier tələb edilmir, digər dəyişdirilməz tapşırıqlarla paralel icra oluna bilər
        DispatchQueue.global().async {
            // Yoğun emal...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Dəyişdirilməz metod - barrier deyil
        return data
    }
}

Grand Central Dispatch (GCD) ilə barrier nümunəsi:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

func performTasks() {
    concurrentQueue.async {
        print("Tapşırıq 1 başladı")
        Thread.sleep(forTimeInterval: 1) // İş simulyasiyası
        print("Tapşırıq 1 bitdi")
    }

    concurrentQueue.async {
        print("Tapşırıq 2 başladı")
        Thread.sleep(forTimeInterval: 1)
        print("Tapşırıq 2 bitdi")
    }

    // Barrier tapşırığı
    concurrentQueue.async(flags: .barrier) {
        print("Barrier tapşırığı başladı")
        Thread.sleep(forTimeInterval: 2) // Eksklüziv giriş tələb edən iş
        print("Barrier tapşırığı bitdi")
    }

    concurrentQueue.async {
        print("Tapşırıq 3 başladı")
        Thread.sleep(forTimeInterval: 1)
        print("Tapşırıq 3 bitdi")
    }

    concurrentQueue.async {
        print("Tapşırıq 4 başladı")
        Thread.sleep(forTimeInterval: 1)
        print("Tapşırıq 4 bitdi")
    }
}

// Çıxış Barrier tapşırığı tamamlandıqdan sonra Task 3 və Task 4-ün başladığını göstərəcək.