Sobes.tech
Middle+

Kas vyksta su paraleline eile pradėjus barjerinę operaciją?

sobes.tech AI

Atsakymas iš AI

Lygiagretus eilė laikinai tampa seka. Iki barjero vykdomos užduotys baigiamos, tada vykdoma tik barjero užduotis. Naujos užduotys ne pradeda veikti iki barjero pabaigos. Po barjero užduoties pabaigos eilė atnaujina lygiagretį vykdymą likusioms užduotims.

Pavyzdys naudojant async/await su barjeru actor pagrindu:

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

    func addData(_ item: String) { // Mutuojanti funkcija - barjeras
        data.append(item)
        print("Pridėta \(item). Dabartiniai duomenys: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Nemutuojanti
        // Nereikalauja barjero, gali būti vykdoma lygiagrečiai su kitomis nemutuojančiomis
        DispatchQueue.global().async {
            // Intensyvus apdorojimas...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Nemutuojanti funkcija - ne barjeras
        return data
    }
}

Pavyzdys naudojant Grand Central Dispatch (GCD) su barjeru:

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

func performTasks() {
    concurrentQueue.async {
        print("Užduotis 1 pradėta")
        Thread.sleep(forTimeInterval: 1) // Imituoja darbą
        print("Užduotis 1 baigta")
    }

    concurrentQueue.async {
        print("Užduotis 2 pradėta")
        Thread.sleep(forTimeInterval: 1)
        print("Užduotis 2 baigta")
    }

    // Barjerinė užduotis
    concurrentQueue.async(flags: .barrier) {
        print("Barjerinė užduotis pradėta")
        Thread.sleep(forTimeInterval: 2) // Imituoja darbą, reikalaujantį išskirtinio prieigos
        print("Barjerinė užduotis baigta")
    }

    concurrentQueue.async {
        print("Užduotis 3 pradėta")
        Thread.sleep(forTimeInterval: 1)
        print("Užduotis 3 baigta")
    }

    concurrentQueue.async {
        print("Užduotis 4 pradėta")
        Thread.sleep(forTimeInterval: 1)
        print("Užduotis 4 baigta")
    }
}

// Rezultatas parodys, kad užduotys Task 3 ir Task 4 prasideda tik po Barjerinės užduoties pabaigos.