Rolf B: javascript race condition

Beitrag lesen

Hallo 1unitedpower,

dein Beispiel zeigt handgemachtes, kooperatives Multitasking mit Hilfe einer externen Ressource (die Event Queue). Und du "rettest" einen globalen Wert vorsätzlich über einen Thread-Wechsel hinweg. Ts ts ts... 😉

Unter einer Race-Condition verstehe ich, dass zwei Programmsegmente echt parallel laufen und man nicht weiß wer zuerst fertig ist. Das ist zunächst nicht schlimm. Bugs durch Race-Conditions entstehen, wenn der Programmierer dieses Unwissen nicht beachtet und Annahmen über die zeitliche Abfolge trifft. Und ja, natürlich hast Du recht, wenn ich eine definierte zeitliche Abfolge brauche, muss ich Serialisierungshilfen wie Semaphore und Locks verwenden.

Die für JavaScript wichtige Erkenntnis ist aber: Ein JavaScript-Programm wird in Zyklen ausgeführt. Jeder Zyklus beginnt mit der Entnahme eines Auftrags aus der Event-Queue. Und dann wird er durchlaufen, von Anfang bis Ende, ohne Unterbrechung. Er kann weitere Aufträge in die Event-Queue einstellen, die werden dann später ausgeführt. Funktionen wie setTimeout oder fs.readJson hinterlassen Einträge in der Event-Queue, mal direkt, mal indirekt. Innerhalb eines Zyklus gibt es keine Race-Condition. Wenn logische Abläufe über mehrere Zyklen gehen, dann schon.

Rolf

--
sumpsi - posui - clusi