Comment éliminer les courses lors de l'exécution concurrente de threads en utilisant GCD?
sobes.tech IA
Réponse de l'IA
Dans GCD (Grand Central Dispatch), pour éviter les conditions de course lors de travaux concurrents, on utilise la synchronisation d’accès aux ressources communes. Les approches principales :
-
Utilisation de files sérielles (serial) : si toutes les opérations sur une ressource partagée s’effectuent dans une seule file sérielle, elles seront exécutées en ordre, évitant ainsi l’accès simultané.
-
Utilisation de barrières (barrier blocks) dans des files concurrentes : les barrières garantissent que toutes les tâches précédentes se terminent avant de commencer la barrière, et les tâches suivantes commencent après.
Exemple d’utilisation d’une file sérielle pour protéger une ressource :
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
var sharedResource = 0
func incrementResource() {
serialQueue.async {
sharedResource += 1
print("Ressource incrémentée à \(sharedResource)")
}
}
Ainsi, les opérations sur sharedResource ne seront pas exécutées simultanément, ce qui prévient les conditions de course.