/* Page prose (fr) */
"WrappingUp" = "# Récapitulatif\n\nCes deux outils répondent à deux questions différentes, et savoir laquelle tu poses représente l'essentiel de la bataille: un groupe demande \"quand toute cette tournée est-elle terminée?\", un sémaphore demande \"combien peuvent s'exécuter à la fois?\". Les deux récompensent une comptabilité soignée et punissent la négligence par des blocages, des plantages et des interblocages. Garde à portée de main les règles d'équilibre ci-dessous.\n\n* Un **`DispatchGroup`** suit un ensemble de tâches et se déclenche quand elles sont toutes terminées; un **`DispatchSemaphore`** limite combien touchent une ressource à la fois.\n* Les deux **se composent**: utilise un sémaphore pour plafonner combien s'exécutent à la fois et un groupe pour savoir quand toute la tournée est terminée, exactement l'appariement qu'a utilisé l'exemple de l'espresso.\n* `notify(queue:)` exécute un callback quand le groupe se vide et **ne bloque jamais**. Préfère-le. `wait()` bloque le thread appelant, donc garde-le hors du thread principal.\n* **Piège:** un `enter`/`leave` déséquilibré soit **se bloque** (trop peu de leaves) soit **plante** (trop de leaves); un `wait()` sans `signal()` correspondant provoque un interblocage de tous ceux qui sont derrière lui. `defer { group.leave() }` / `defer { sem.signal() }` juste après est le motif sûr.\n* **Piège:** lancer des dizaines de tâches bloquées par sémaphore sur une file globale peut affamer le pool de threads de GCD. Pour une limitation intensive, une petite file dédiée (ou, plus tard, la concurrence structurée) se comporte mieux.\n* **Piège:** un sémaphore limite *combien* s'exécutent à la fois, pas *laquelle* s'exécute ensuite: ne te fie pas à l'ordre dans lequel les tâches acquièrent les permis.\n* Avec un compte de 1 un sémaphore agit comme un verrou, mais des outils plus sûrs et plus difficiles à oublier existent, et les actors remplaceront ceci entièrement.\n\n---\n\n## La suite\n\nLe chapitre suivant est [Les dangers de la concurrence](Concurrency%20Hazards.playgroundchapter/Overview): la data race que tu as entrevue dans l'exemple du compte, ainsi que l'interblocage et l'inversion de priorité, ce qui tourne mal quand l'état partagé et le blocage se heurtent, et comment raisonner à ce sujet.\n\n[Précédent](@previous)  |  page 8 sur 8";
