Sobes.tech
Middle+

Ce se întâmplă cu coada paralelă la pornirea unei operații de barieră?

sobes.tech AI

Răspuns de la AI

Coada paralelă devine temporar o coadă secvențială. Task-urile care rulează înainte de barier se finalizează, apoi se execută doar task-ul de barier. Task-urile noi nu încep până când task-ul de barier nu se finalizează. După finalizarea task-ului de barier, coada reia execuția paralelă pentru task-urile rămase.

Exemplu de utilizare a async/await cu o barieră bazată pe actor:

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

    func addData(_ item: String) { // Metodă mutabilă - barieră
        data.append(item)
        print("Adăugat \(item). Datele curente: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Non mutabil
        // Nu necesită barieră, poate fi executat în paralel cu alte non mutabile
        DispatchQueue.global().async {
            // Procesare intensă...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Metodă non mutabilă - nu barieră
        return data
    }
}

Exemplu de utilizare a Grand Central Dispatch (GCD) cu o barieră:

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

func performTasks() {
    concurrentQueue.async {
        print("Task 1 început")
        Thread.sleep(forTimeInterval: 1) // Simulare de lucru
        print("Task 1 terminat")
    }

    concurrentQueue.async {
        print("Task 2 început")
        Thread.sleep(forTimeInterval: 1)
        print("Task 2 terminat")
    }

    // Task de barieră
    concurrentQueue.async(flags: .barrier) {
        print("Task de barieră început")
        Thread.sleep(forTimeInterval: 2) // Simulare de lucru care necesită acces exclusiv
        print("Task de barieră terminat")
    }

    // Alte task-uri
    concurrentQueue.async {
        print("Task 3 început")
        Thread.sleep(forTimeInterval: 1)
        print("Task 3 terminat")
    }

    concurrentQueue.async {
        print("Task 4 început")
        Thread.sleep(forTimeInterval: 1)
        print("Task 4 terminat")
    }
}

// Output-ul va arăta că Task 3 și Task 4 încep doar după ce Task-ul de barieră s-a încheiat.