Race Conditions, Locks und Deadlocks

Problem

Zwei Worker aktualisieren den freigegebenen Zähler einer Anwendung. Beide lesen 40, beide fügen einen hinzu und beide schreiben 41. Zwei Anfragen wurden abgeschlossen, aber der Zähler wurde nur einmal erhöht. Der Fehler verschwindet, wenn Sie eine Anfrage nach der anderen testen.

Lösung — Synchronisation

Dies ist eine Race Condition: Die Korrektheit hängt von der zeitlichen Verschachtelung der Operationen ab. Lesen, Ändern und Schreiben bilden für sich noch keine unteilbare Operation. Ein Mutex gewährt jeweils einem Teilnehmer exklusiven Zugang zu einem geschützten Abschnitt. Verwenden beide Worker dieselbe Sperre um die gesamte Änderung, liest der zweite 41 und schreibt 42. Ein unterstütztes atomares Inkrement kann diesen speziellen Fall direkter lösen. Ein Semaphor verwaltet eine Anzahl von Zugriffsberechtigungen. Zehn davon können eine Ressource auf zehn gleichzeitige Nutzer begrenzen; jeder gibt seine Berechtigung nach Abschluss zurück. Sperren bergen eigene Risiken. Hält Worker A die Sperre X und wartet auf Y, während B die Sperre Y hält und auf X wartet, entsteht ein Deadlock. Kurze geschützte Abschnitte, eine einheitliche Reihenfolge beim Erwerb mehrerer Sperren und ihre zuverlässige Freigabe begrenzen dieses Risiko. Eine Sperre innerhalb einer Anwendungsinstanz koordiniert nur deren Teilnehmer.
Kerngedanke: Gemeinsam veränderbarer Zustand benötigt Koordination über den gesamten Vorgang und alle beteiligten Teilnehmer hinweg.