Sobes.tech
Middle+

Šta se dešava sa paralelnom redom kada se pokrene barijerska operacija?

sobes.tech АИ

Одговор од АИ

Paralelna red čekanja privremeno postaje sekvencijalna. Zadaci koji se izvršavaju pre barijere se završavaju, zatim se izvršava samo zadatak barijere. Novi zadaci ne počinju dok se zadatak barijere ne završi. Nakon završetka zadatka barijere, red se vraća na paralelno izvršavanje za preostale zadatke.

Primer korišćenja async/await sa barijerom zasnovanom na actor:

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

    func addData(_ item: String) { // Mutabilni metod - barijera
        data.append(item)
        print("Dodat \(item). Trenutni podaci: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Nemutabilno
        // Ne zahteva barijeru, može se izvršavati paralelno sa drugim nemutabilnim
        DispatchQueue.global().async {
            // Intenzivna obrada...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Nemutabilna metoda - ne barijera
        return data
    }
}

Primer korišćenja Grand Central Dispatch (GCD) sa barijerom:

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

func performTasks() {
    concurrentQueue.async {
        print("Zadatak 1 počeo")
        Thread.sleep(forTimeInterval: 1) // Simulacija rada
        print("Zadatak 1 završio")
    }

    concurrentQueue.async {
        print("Zadatak 2 počeo")
        Thread.sleep(forTimeInterval: 1)
        print("Zadatak 2 završio")
    }

    // Zadatak barijere
    concurrentQueue.async(flags: .barrier) {
        print("Zadatak barijere počeo")
        Thread.sleep(forTimeInterval: 2) // Simulacija rada koji zahteva ekskluzivan pristup
        print("Zadatak barijere završio")
    }

    // Ostali zadaci
    concurrentQueue.async {
        print("Zadatak 3 počeo")
        Thread.sleep(forTimeInterval: 1)
        print("Zadatak 3 završio")
    }

    concurrentQueue.async {
        print("Zadatak 4 počeo")
        Thread.sleep(forTimeInterval: 1)
        print("Zadatak 4 završio")
    }
}

// Izlaz će pokazati da zadaci 3 i 4 počinju tek nakon završetka zadatka barijere.