Sobes.tech
Middle+

Mi történik a párhuzamos sorral a sorompó művelet indításakor?

sobes.tech MI

Válasz az MI-től

A párhuzamos sor ideiglenesen szekvenciális sorozattá válik. A barrier előtt végrehajtott feladatok befejeződnek, majd csak a barrier feladat fut le. Új feladatok nem indulnak el, amíg a barrier feladat be nem fejeződik. A barrier feladat befejezése után a sor párhuzamos végrehajtásba tér vissza a fennmaradó feladatokra.

Példa az async/await használatára egy actor alapú barrierrel:

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

    func addData(_ item: String) { // Módosító metódus - barrier
        data.append(item)
        print("Hozzáadva \(item). Jelenlegi adatok: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Nem módosító
        // Nem igényel barrier-t, párhuzamosan futtatható más nem módosító feladatokkal
        DispatchQueue.global().async {
            // Intenzív feldolgozás...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Nem módosító metódus - nem barrier
        return data
    }
}

Grand Central Dispatch (GCD) barrier példával:

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

func performTasks() {
    concurrentQueue.async {
        print("Feladat 1 indult")
        Thread.sleep(forTimeInterval: 1) // Munka szimulálása
        print("Feladat 1 befejeződött")
    }

    concurrentQueue.async {
        print("Feladat 2 indult")
        Thread.sleep(forTimeInterval: 1)
        print("Feladat 2 befejeződött")
    }

    // Barrier feladat
    concurrentQueue.async(flags: .barrier) {
        print("Barrier feladat indult")
        Thread.sleep(forTimeInterval: 2) // Munka, amely kizárólagos hozzáférést igényel
        print("Barrier feladat befejeződött")
    }

    // További feladatok
    concurrentQueue.async {
        print("Feladat 3 indult")
        Thread.sleep(forTimeInterval: 1)
        print("Feladat 3 befejeződött")
    }

    concurrentQueue.async {
        print("Feladat 4 indult")
        Thread.sleep(forTimeInterval: 1)
        print("Feladat 4 befejeződött")
    }
}

// A kimenet megmutatja, hogy a Feladat 3 és Feladat 4 csak a Barrier feladat befejezése után kezdődnek.