schnasseldag - 2017-11-01

Hallo miteinander,

nachdem ich kritische Daten (die sich mehrere Tasks teilen) per SysSem synchronisiert hatte, und anschließend eine Visualisierung zusammenklickte, drängte sich mir unweigerlich die Frage auf, wie die Runtime es wohl hinbekommt, auf diese Daten (korrekt) zuzugreifen. Ob die Visualisierung dabei nun in einem eigenen Thread wohnt oder nicht, ist eigentlich egal. Am Ende ist sie auch "nur" eine (weitere) lesende Task, die auf eigentlich zu synchronisierende Daten zugreifen möchte. Schreibt nun aber eine andere Task zeitgleich zum Lesevorgang der Visualisierungstask, dann könnte da Müll rauskommen.

Was die Runtime zur Übertragung der Daten an die Visualisierung benötigen würde, wären Get-er und Set-er Funktionen, welche Ihrerseits die Enter() und Leave() Aufrufe der entsprechenden Mutexe implementieren. Die sind aber wohl nicht vorgesehen?! Und selbst wenn, dann wäre Datenintegrität über größere Datenbereiche (also nicht skalare Typen) immer noch nicht sichergestellt.

Im Prinzip sehe ich nur eine Chance, daß die Runtime eine (konsistente) Kopie der Daten lesen und schreiben kann. Sie müßte Buchführung über die Enter() und Leave() Aufrufe führen. Das könnte sie sogar recht einfach. Wenn kein einziges Mutex gelockt ist, dann müßte die Runtime kurz alle Tasks suspendieren, die Daten lesen/schreiben und die Tasks wieder resumen. Die kritischen Daten wären dann konsistent gelesen/geschrieben. Ist jetzt irgendetwas inkonsistent, dann hat der Programmierer eben vergessen zu synchronisieren. Mittels der Buchführung weiß die Runtime zwar nicht, welche Daten miteinander synchronisiert werden müssen, sie weiß aber, das der Programmcounter gerade nicht im kritischen Bereich liest oder schreibt.

Bei den unsynchronisierten Daten sieht es schwierig aus wenn die Visualisierung in einer anderen Task als der MainTask läuft. Da weis die Visualisierung nämlich nie, ob irgendein Datuim gerade geschrieben wird, wenn sie darauf zugreift ...

Es gäbe noch eine weitere (theoretische) Möglichkeit. Nachdem der Usercode einer Task ja irgendwann zuende ist, verschwindet der Pgrogrammcounter wieder in der Runtime. Befinden sich alle User-Tasks zufällig gleichzeitig in der Runtime, dann könnte ebenfalls auf die Daten zugegriffen werden. Das ist aber nur ein Theoretikum, weil vermutlich immer irgendeine Task läuft und dieser Zustand somit nie erreicht wird (zumindest nicht deterministisch). Aktiv suspendieren kann die Runtime keine Tasks, weil man sich sónst Deadlocks bauen könnte, wenn ein Mutex-Lock über mehrere Zyklen aufrechterhalten werden würde bevor es wieder ge-unlockt wird. Das das eine Programmierschweinerei wäre, ist klar. Denkbar wäre es aber. Diese "Lösung" scheidet also aus.

Weiß jemand, wie die Synchronisation mit der Visualisierung nun wirklich unter der Haube funktioniert?

Schöne Grüße

schnasseldag