Herunterladen Inhalt Inhalt Diese Seite drucken

Conrad C-Control II Unit Handbuch Seite 78

Kompakter steuerungscomputer
Inhaltsverzeichnis

Werbung

C-Control II Unit
Wie in 5.9.3 bereits gezeigt, wird eine C2-Anweisung in mehreren Einzeloperationen der
virtuellen Maschine ausgeführt. Die Anweisung
check(a, b)
führt etwa zu folgender Befehlskette:
1. a auf den Stack laden
2. b auf den Stack laden
3. Funktion check aufrufen
Wie in 5.9.3 ebenfalls erläutert wurde, kann diese Befehlskette jederzeit von einem
Threadwechsel unterbrochen werden, also auch zwischen dem 1. und 2. Befehl im obigen
Beispiel. Dann kann der measure-Thread bereits neue Werte erfaßt haben, bevor der
watch-Thread wieder an die Reihe kommt. Der watch-Thread setzt seine Ausführung
mit dem Laden von b und dem Aufruf von check fort. An die Funktion check wird jetzt
also ein a aus einem alten und b aus dem neuen Meßzyklus übergeben. Abhängig
davon, was check konkret von a und b erwartet, kann das zu einer schweren Fehlfunktion
des Programms führen! Im ungünstigsten Fall läuft ein Programm mit einem potentiellen
Aliasing-Problem in der Testphase völlig problemlos, wenn die Aliasing-Bedingung sehr
selten eintritt.
Zur Vermeidung von Konkurrenz- und Aliasing-Situationen müssen Threads an bestimmten
kritischen Stellen synchronisiert werden, d.h. Threads müssen gezwungen werden, vor der
weiteren Programmabarbeitung auf eine Art "Freizeichen" zu warten. Bei Verfügbarkeit des
"Freizeichens" muß der wartende Thread sofort ein "Besetzt" signalisieren, um konkurrie-
rende Threads zum Warten zu zwingen. Hat ein Thread den kritischen Programmbereich
durchlaufen, muß er das "Besetzt" zurücknehmen und das "Freizeichen" signalisieren.
Anderenfalls würden die auf das "Freizeichen" wartenden Threads auf ewig blockiert
bleiben.
Bei genauer Überlegung der Problematik leuchtet ein, daß die Aktion "testen ob
Freizeichen, wenn ja, dann besetzten" atomar sein muß, d.h. nicht durch einen
Threadwechsel unterbrochen werden darf. Eine wait-Anweisung mit nachfolgendem
Löschen einer "frei"-Variable erfüllt diese Voraussetzung nicht!
z.B.
wait free;
free = 0;
78
// 2 virtuelle Maschinenoperationen
// 2 virtuelle Maschinenoperationen

Quicklinks ausblenden:

Werbung

Inhaltsverzeichnis
loading

Inhaltsverzeichnis