Junior
Qu'est-ce qu'un deadlock?
sobes.tech IA
Réponse de l'IA
Le deadlock (verrouillage mutuel) est un état où deux ou plusieurs threads ou processus se bloquent mutuellement en attendant que l'autre libère une ressource pour continuer l'exécution. Cela se produit lorsque chaque thread possède une ressource dont l'autre a besoin, et attend que cette ressource soit libérée.
Quatre conditions nécessaires pour qu'un deadlock se produise (conditions de Coffman):
- Exclusion mutuelle (Mutual Exclusion): La ressource ne peut pas être utilisée simultanément par plusieurs processus.
- Retenue et attente (Hold and Wait): Un thread qui possède déjà au moins une ressource attend d'en acquérir d'autres qui sont détenues par d'autres threads.
- Absence de préemption (No Preemption): Les ressources ne peuvent pas être forcées à être retirées d'un thread. Elles ne peuvent être libérées que volontairement par le thread qui les détient.
- Attente circulaire (Circular Wait): Il existe un cycle d'attentes entre deux ou plusieurs threads. Par exemple, le Thread A attend une ressource détenue par le Thread B, qui attend une ressource détenue par le Thread C, qui attend une ressource détenue par le Thread A.
Dans le développement iOS, les deadlocks surviennent souvent lors de l'utilisation de la concurrence, par exemple, en utilisant incorrectement GCD (Grand Central Dispatch) ou les queues d'opérations:
- Tenter d'exécuter de manière synchrone un bloc de code sur une queue où se trouve déjà le thread actuel (par exemple, appeler
syncsur la queuemaindepuis le thread principal). - Deux threads tentent d'acquérir deux verrous ou sémaphores dans un ordre différent.
Exemple simple de deadlock avec GCD:
func deadlockExample() {
// Queue principale
let mainQueue = DispatchQueue.main
// Exécuter de manière synchrone un bloc sur la queue principale depuis le thread principal
// Le thread principal attend la fin du bloc,
// et le bloc ne peut pas s'exécuter car le thread principal est occupé à attendre.
mainQueue.sync {
print("Cette ligne ne sera jamais atteinte.")
}
}