/* Page prose (fr) */
"Deadlock" = "# Interblocage: s'attendre soi-même, pour toujours\n\nUn **interblocage** est le cas où le travail s'arrête de façon permanente parce que les tâches s'attendent les unes les autres en cercle, et personne ne peut avancer. La version la plus simple ne nécessite qu'une file et un mot: `sync`.\n\nRappelle-toi que `sync` signifie *\"exécute ce bloc et ne reviens pas tant qu'il n'est pas terminé.\"* Maintenant, le gel classique. En s'exécutant sur le thread principal, on fait `sync` sur la file principale:\n\n```swift\n// ⚠️ DO NOT RUN THIS: it deadlocks the main thread forever.\nimport Foundation\n\nDispatchQueue.main.sync {\n    print(\"This line never runs.\")\n}\n```\n\nSuis la logique:\n\n1. Tu es sur le thread principal. Tu appelles `main.sync { ... }`.\n2. `sync` dit: \"J'attendrai ici même jusqu'à ce que ce bloc se termine.\"\n3. Mais le bloc est programmé pour s'exécuter sur la **file principale**, qui est justement le thread maintenant gelé à l'intérieur de `sync`, en attente.\n4. Le thread principal attend le bloc; le bloc ne peut pas démarrer tant que le thread principal n'est pas libre. Aucun ne cède jamais. **Gelé.**\n\nC'est une attente circulaire avec un seul participant. Le même piège se déclenche chaque fois que tu fais `sync` sur **une file en série sur laquelle tu t'exécutes déjà**:\n\n```swift\n// ⚠️ DO NOT RUN THIS EITHER: same deadlock, different disguise.\nimport Foundation\n\nlet ledger = DispatchQueue(label: \"ledger\")   // serial\n\nledger.sync {\n    // We are now running *on* ledger...\n    ledger.sync {          // ...and we ask it to run something and wait.\n        print(\"Unreachable.\")   // ledger is busy with us. Circular wait.\n    }\n}\n```\n\nOn a exécuté l'exemple avec course en direct parce qu'un nombre faux est inoffensif. On n'exécute **pas** ceux-ci, parce qu'un interblocage n'imprime rien; il laisse juste la page du Playground bloquée jusqu'à ce que tu l'arrêtes manuellement. C'est exactement pourquoi la règle mérite d'être mémorisée:\n\n**N'appelle jamais `sync` en ciblant la file sur laquelle tu es déjà. En particulier, ne fais jamais `DispatchQueue.main.sync` depuis le thread principal.**\n\n`async` n'a pas ce problème: il remet le bloc et revient immédiatement, donc il n'y a personne qui reste planté à attendre. Quand tu as besoin de rebondir vers la file principale pour mettre à jour l'UI, c'est `DispatchQueue.main.async`, toujours.\n\n[Précédent](@previous)  |  page 6 sur 9  |  [Suivant: Inversion de priorité](@next)";
