Sobes.tech
Middle+

Co se děje s paralelní frontou při spuštění bariérové operace?

sobes.tech AI

Odpověď od AI

Paralelní fronta se dočasně stává sekvenční. Úkoly, které se vykonávají před bariérou, jsou dokončeny, poté se vykoná pouze úkol bariéry. Nové úkoly ne jsou spouštěny, dokud není úkol bariéry dokončen. Po dokončení úkolu bariéry se fronta vrací k paralelnímu provádění zbývajících úkolů.

Příklad použití async/await s bariérou založenou na actor:

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

    func addData(_ item: String) { // Mutující metoda - bariéra
        data.append(item)
        print("Přidáno \(item). Aktuální data: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Neměnné
        // Nevyžaduje bariéru, může být spuštěno paralelně s jinými neměnnými
        DispatchQueue.global().async {
            // Intenzivní zpracování...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Neměnná metoda - není bariéra
        return data
    }
}

Příklad použití Grand Central Dispatch (GCD) s bariérou:

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

func performTasks() {
    concurrentQueue.async {
        print("Úkol 1 začal")
        Thread.sleep(forTimeInterval: 1) // Simulace práce
        print("Úkol 1 dokončen")
    }

    concurrentQueue.async {
        print("Úkol 2 začal")
        Thread.sleep(forTimeInterval: 1)
        print("Úkol 2 dokončen")
    }

    // Úkol bariéry
    concurrentQueue.async(flags: .barrier) {
        print("Úkol bariéry začal")
        Thread.sleep(forTimeInterval: 2) // Simulace práce vyžadující exkluzivní přístup
        print("Úkol bariéry dokončen")
    }

    // Další úkoly
    concurrentQueue.async {
        print("Úkol 3 začal")
        Thread.sleep(forTimeInterval: 1)
        print("Úkol 3 dokončen")
    }

    concurrentQueue.async {
        print("Úkol 4 začal")
        Thread.sleep(forTimeInterval: 1)
        print("Úkol 4 dokončen")
    }
}

// Výstup ukáže, že úkoly 3 a 4 začínají až po dokončení úkolu bariéry.