Sobes.tech
Middle+

Čo sa deje s paralelným frontom pri spustení bariérových operácií?

sobes.tech AI

Odpoveď od AI

Paralelné fronty sa dočasne stávajú sekvenčnými. Úlohy vykonávané pred bariérou sa dokončia, potom sa vykoná iba bariérová úloha. Nové úlohy sa nespúšťajú pred dokončením bariéry. Po dokončení bariérovéj úlohy sa fronta obnoví na paralelné vykonávanie zostávajúcich úloh.

Príklad použitia async/await s bariérou na základe actor:

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

    func addData(_ item: String) { // Mutujúca metóda - bariéra
        data.append(item)
        print("Pridané \(item). Aktuálne dáta: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Nemutujúca
        // Nevyžaduje bariéru, môže bežať paralelne s inými nemutujúcimi
        DispatchQueue.global().async {
            // Intenzívne spracovanie...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Nemutujúca metóda - nie bariéra
        return data
    }
}

Príklad použitia Grand Central Dispatch (GCD) s bariérou:

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

func performTasks() {
    concurrentQueue.async {
        print("Úloha 1 začala")
        Thread.sleep(forTimeInterval: 1) // Napodobnenie práce
        print("Úloha 1 skončila")
    }

    concurrentQueue.async {
        print("Úloha 2 začala")
        Thread.sleep(forTimeInterval: 1)
        print("Úloha 2 skončila")
    }

    // Bariérová úloha
    concurrentQueue.async(flags: .barrier) {
        print("Bariérová úloha začala")
        Thread.sleep(forTimeInterval: 2) // Napodobnenie práce vyžadujúcej exkluzívny prístup
        print("Bariérová úloha skončila")
    }

    concurrentQueue.async {
        print("Úloha 3 začala")
        Thread.sleep(forTimeInterval: 1)
        print("Úloha 3 skončila")
    }

    concurrentQueue.async {
        print("Úloha 4 začala")
        Thread.sleep(forTimeInterval: 1)
        print("Úloha 4 skončila")
    }
}

// Výstup bude ukazovať, že úlohy Task 3 a Task 4 začínajú až po dokončení bariérovéj úlohy.