Nebenläufige Ereignisgesteuerte Programmierung geht nicht

Nebenläufigkeit
Parallele oder asynchrone* gleichzeitige Programmausführung.
Seit einigen Jahren besitzen CPUs mehrere Kerne. Die wollen wir gerne alle nutzen, indem das Programm mehrere Dinge gleichzeitig (parallel) ausführt. Oder indem wir eine Aufgabe in einem neuen Faden (asynchron) starten und dann bei vorliegendem Ergebnis reagieren.
Verteiltes Rechnen
Noch komplizierter ist nur die Nebenläufigkeit über mehrere Maschinen verteilt.
Ereignisgesteuert (Event Driven)
Ein Programmier-Paradigma, bei dem das Programm vorwiegend auf Ereignisse reagiert.
Dies ist die Grundlage des gesamten MS-Windows Betriebssystems und allen Technologien zur Programmierung von Microsoft (und neuerdings auch bei Google / AngularJS).

*) Ich unterscheide zwischen asynchroner und paralleler Ausführung. Einen Vorgang (z.B. eine Webseitenabfrage) asynchron zu starten, ist wie einen Ball mit einer Hand in die Luft werfen und ihn mit der anderen wieder auffangen (wenn die Webseite da ist). Parallel entspricht dagegen eher dem Bild von mehreren Pferden auf einer Galopprennbahn. Z.B. wenn mehrere Threads in FuzzyDupes stundenlang um die Wette nach Dubletten suchen und dabei konkurrierend auf gemeinsame Ressourcen zugreifen müssen.

Problem

Durch die Nebenläufigkeit finden die Ereignisse in undefinierter Reihenfolge statt. Ereignisgesteuerte Programmierung ist daher nicht geeignet, um nebenläufige Programme zu steuern.

Lösung 1: Futures / Promises

Diese lösen das Problem nur für den asynchronen Fall, helfen jedoch nicht bei Parallelität.

Lösung 2: Zustandsmaschinen (State-Machines)

In State-Machines werden die Übergänge zwischen zwei verschiedenen Zuständen (Transitions) behandelt. Dies ermöglicht dann auch die vollständige Fallbehandlung in parallel ausgeführten Programmabschnitten.

Asynchron, parallel oder verteilt? Die Antwort sind Zustandsmaschinen.

Detlef Kroll

  async .. await in C# ist nichts anderes als ein Versprechen (sic!), aber es fehlen einige Optionen. Ein besseres Versprechen mit Fehlerbehandlung und Promise-Pipelining durch Funktionsverkettung finden Sie hier.

  Meine Lieblings-Implementierung einer State-Machine in C# finden Sie hier.

Fazit

Wir brauchen State-Machines und eine Syntax zur Behandlung von States (vergleichbar mit Eventhandlern) in allen Programmiersprachen, die Nebenläufigkeit erlauben, als grundlegende Funktion. Diese Funktionalität muss 100% threadsafe sein, denn wir wollen damit Threads managen.

Das Wort „Thread-Synchronisierung“ sollte ganz schnell aus dem Wortschatz der Informatik gestrichen und durch das Wort „Transition“ ersetzt werden.

Viele Programmiersprachen bieten neuerdings Features zur asynchronen und parallelen Programmausführung, ohne Lösungen für die dabei entstehenden schwerwiegenden Probleme anzubieten. Das führt zu großer Frustration bei den Entwicklern, die nun denken, einfach asynchrone oder parallele Programme schreiben zu können.