Sobes.tech
Middle+

Que se passe-t-il avec la file d'attente parallèle lors du lancement d'une opération de barrière?

sobes.tech IA

Réponse de l'IA

La file d'attente parallèle devient temporairement une file séquentielle. Les tâches en cours avant la barrière se terminent, puis seule la tâche de barrière s'exécute. De nouvelles tâches ne sont pas lancées jusqu'à ce que la tâche de barrière soit terminée. Après la fin de la tâche de barrière, la file reprend une exécution parallèle pour les tâches restantes.

Exemple d'utilisation de async/await avec une barrière basée sur actor:

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

    func addData(_ item: String) { // Méthode mutable - barrière
        data.append(item)
        print("Ajouté \(item). Données actuelles : \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Non mutable
        // Ne nécessite pas de barrière, peut s'exécuter en parallèle avec d'autres non mutables
        DispatchQueue.global().async {
            // Traitement intensif...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Méthode non mutable - pas de barrière
        return data
    }
}

Exemple d'utilisation de Grand Central Dispatch (GCD) avec une barrière:

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

func performTasks() {
    concurrentQueue.async {
        print("Tâche 1 démarrée")
        Thread.sleep(forTimeInterval: 1) // Simulation de travail
        print("Tâche 1 terminée")
    }

    concurrentQueue.async {
        print("Tâche 2 démarrée")
        Thread.sleep(forTimeInterval: 1)
        print("Tâche 2 terminée")
    }

    // Tâche de barrière
    concurrentQueue.async(flags: .barrier) {
        print("Tâche de barrière démarrée")
        Thread.sleep(forTimeInterval: 2) // Simulation de travail nécessitant un accès exclusif
        print("Tâche de barrière terminée")
    }

    concurrentQueue.async {
        print("Tâche 3 démarrée")
        Thread.sleep(forTimeInterval: 1)
        print("Tâche 3 terminée")
    }

    concurrentQueue.async {
        print("Tâche 4 démarrée")
        Thread.sleep(forTimeInterval: 1)
        print("Tâche 4 terminée")
    }
}

// La sortie montrera que les tâches 3 et 4 commencent seulement après la fin de la tâche de barrière.