/* Page prose (de) */
"Overview" = "# Gruppen und Semaphoren\n\nZurück in der Kaffeebar an der Ecke bestellt ein Kunde eine Runde für das ganze Büro: einen Latte, einen Cold Brew und einen Espresso. Du stößt alle drei auf einmal an, damit sie parallel gebrüht werden. Gut. Aber jetzt hast du ein neues Problem. Du kannst dem Kunden das Tablett erst reichen, wenn **alle drei** fertig sind, und jeder wird zu seiner eigenen Zeit fertig. Woher *weiß* dein Code, dass die Runde vollständig ist? Und was passiert, wenn fünf Baristas im selben Moment die eine Espressomaschine wollen? In diesem Kapitel geht es darum, eine Gruppe unabhängiger Aufgaben zu koordinieren: auf sie alle zu warten und zu begrenzen, wie viele gleichzeitig laufen.\n\n---\n\n## Was du lernst\n\n* Wie du mit einer **`DispatchGroup`** auf eine ganze Runde asynchroner Aufgaben wartest.\n* Das Gleichgewicht von `enter()`/`leave()`, `notify(queue:)` und `wait()`, und warum `wait()` blockiert.\n* Der klassische Fehler mit unausgeglichenem `enter`/`leave` und wie er hängt oder abstürzt.\n* Wie ein **`DispatchSemaphore`** begrenzt, wie viele Aufgaben gleichzeitig auf eine Ressource zugreifen.\n* Wann du zu einer Gruppe und wann zu einem Semaphor greifst.\n\nDieses Kapitel baut auf dem Kapitel [GCD-Grundlagen](GCD%20Fundamentals.playgroundchapter/Overview) auf: Du weißt bereits, wie du mit `async` Arbeit auf eine Warteschlange schiebst, und den Unterschied zwischen seriellen und nebenläufigen Warteschlangen. Jetzt koordinierst du diese Arbeit.\n\nWenn du bereit bist, blättere um, und wir stoßen eine Runde Getränke auf die naive Art an und sehen zu, wie es schiefgeht.\n\nSeite 1 von 8  |  [Weiter: Das Problem: wissen, wann alles fertig ist](@next)";
