/* Page prose (ja) */
"ClassicBugUnbalancedEnterLeave" = "# 古典的なバグ: 不均衡な `enter`/`leave`\n\nDispatch Group は、その帳簿付けの正しさの分だけしか正しくありません。ルールは絶対です。**すべての経路で、`enter()` 一回につき `leave()` をちょうど一回。** どちらの方向にこれを破っても、それぞれ別の失敗が生じます。\n\n`leave()` が少なすぎると、グループはハングします。ある経路で `leave()` を見落とすと、カウンターは決してゼロに戻りません。`notify` は発火せず、`wait()` は永遠に待ちます。";
"ClassicBugUnbalancedEnterLeave-2" = "上の名前は空ではないので、たまたま動きますが、この形こそが危険です。\n\n* callout(試してみよう): 配列に空文字列 `\"\"` を加えて、もう一度実行してみましょう。その空の名前は `guard` に引っかかり、`leave()` を呼ばずに*戻り*ます。そのためグループのカウンターは決してゼロに戻りません。結果として、三つの本物のドリンクは表示されますが、`This may never print…` は決して表示されず、ページは自分で止めるまで走り続けます。クラッシュもエラーもなく、決して届かない「すべて完了」だけが残るこの静かなハングこそが、このバグのすべてです。\n\n> `guard`、`throw`、あるいはエラー分岐が `leave()` の前に戻った瞬間、そのタスクは決してグループから抜けず、あなたの「すべて完了」のコールバックは静かに決して実行されません。**`enter()` の直後に置く `defer { group.leave() }` は、あらゆる終了経路で leave を保証します**。これが標準的な処方箋です。\n\n`leave()` が多すぎるとクラッシュが生じます。`enter()` を呼んだ回数より多く `leave()` を呼ぶと、グループのカウントが負になり、*「Unbalanced call to dispatch_group_leave.」*のようなエラーで実行時にトラップします。これはたいてい `enter()` を間違った場所に置くことから来ます。たとえば、ループの*外*で一度だけ呼び、`leave()` は各反復の*中*で呼ぶ場合です。カウンターは最初のタスクの後にゼロに達し、他のタスクがまだ走っているうちに `notify` が**早すぎるタイミングで発火しすぎ**、余分な leave がそのあとクラッシュを引き起こします。`enter()` と `leave()` は同じレベルでペアに保ちましょう。\n\n[前へ](@previous)  |  5 / 8 ページ  |  [次へ: DispatchSemaphore: 同時に実行できる数を制限する](@next)";
