/* Page prose (de) */
"SemaphoreAsLock" = "# Ein Semaphor von 1 als Lock (und warum du vorsichtig sein solltest)\n\nSetze die Zahl auf **1** und ein Semaphor wird zu einem **Lock**, einem Tor, das nur eine Aufgabe nach der anderen passieren kann. Alles zwischen `wait()` und `signal()` ist ein **kritischer Abschnitt**: Code, der laufen muss, ohne dass ein anderer Thread ihn unterbricht.\n\nWarum solltest du das brauchen? Weil zwei Aufgaben, die gleichzeitig dieselbe Variable anfassen, sie beschädigen können. Der Code unten hat 500 Aufgaben, die jeweils einen gemeinsamen Zähler erhöhen.";
"SemaphoreAsLock-2" = "**Sieh es laufen:** Du bekommst `500`, jedes Mal.\n\n* callout(Probier es aus): Kommentiere die Zeilen `lock.wait()` und `lock.signal()` aus und führe es ein paar Mal aus. Du bekommst eine Zahl *kleiner* als 500, und bei jedem Durchlauf eine andere. Das ist ein **Data Race**: Ohne den Lock lesen mehrere Aufgaben denselben `seen`-Wert, jede addiert eins, und jede schreibt dasselbe Ergebnis zurück, also fallen diese Inkremente zu einem einzigen zusammen. Der Lock erzwingt, dass das Lesen und das Schreiben als eine Einheit geschehen, also geht keine Aktualisierung verloren.\n\nDas funktioniert, aber greife vorsichtig dazu. Ein Semaphor mit Zahl 1 hat dieselbe fragile Buchführung wie `enter`/`leave`: Vergiss ein `signal()` auf einem Fehlerpfad und jede andere Aufgabe wartet für immer (ein **Deadlock**). Er blockiert außerdem echte Threads, während sie in der Warteschlange stehen. Für einfachen gegenseitigen Ausschluss gibt es leichtere, sicherere Werkzeuge (eine serielle Warteschlange oder `NSLock`), und Swifts moderne Antwort, die **Actors**, macht diese Art des Schutzes von gemeinsamem Zustand zu einem Sprachfeature, das du nicht auszugleichen vergessen kannst. Dem Race selbst begegnest du direkt im nächsten Kapitel, und den Actors später im Buch. Für den Moment merke dir nur: Ein Semaphor *kann* ein Lock sein, aber \"Lock\" ist nicht seine beste Aufgabe.\n\n[Zurück](@previous)  |  Seite 7 von 8  |  [Weiter: Zusammenfassung](@next)";
