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.