Aufgabe 6: Ereignisbearbeitung und Synchronisation
Lernziel
- Synchronisation mit Hilfe von Semaphoren und anderen Kernobjekten
Aufgabenbeschreibung
OO-Stubs soll nun um Synchronisationsobjekte erweitert werden, mit denen Threads sich gegenseitig über verschiede Ereignisse informieren bzw. auf Ereignisse "warten" können. Folgende Synchronisationsobjekte sollen in dieser Aufgabe erstellt werden:
- Mit Hilfe von Semaphoren besteht die Möglichkeit,
Anwendungsprozesse miteinander zu synchronisieren. Darüberhinaus sollen sie dazu verwendet werden, Anwendungsprozesse bei der Tastaturabfrage zu blockieren, bis eine
Taste gedrückt wurde.
- Durch Buzzer (Wecker) können Threads sich für eine bestimmte Zeit schlafen legen.
Hierzu müssen die Klassen Waitingroom, Semaphore, Customer, Organizer, Bell, Bellringer, Buzzer, Guarded_Buzzer, Guarded_Organizer, Guarded_Semaphore und Guarded_Keyboard
implementiert,
die Klasse Keyboard erweitert und
die Klassen Thread sowie Watch angepasst werden.
Die Klasse Guarded_Scheduler wird
nicht länger benötigt, da
Guarded_Organizer
ihre Aufgabe übernimmt.
Ebenso soll das globale Guarded_Scheduler Objekt scheduler durch ein
globales Guarded_Organizer Objekt organizer
ersetzt werden.
Bearbeitung
Teil a: Beginnt am besten mit der Implementierung der Semaphoren. Dazu müssen
zunächst die Klassen Waitingroom, Semaphore, Customer, Organizer, Guarded_Organizer und Guarded_Semaphore
implementiert werden.
Mit Hilfe von Semaphorvariablen solltet ihr nun verhindern
können, dass sich eure Anwendungsprozesse bei der
Bildschirmausgabe gegenseitig behindern.
Teil b: Im nächsten Schritt könnt ihr dann die Klasse Keyboard um die getkey()
-Methode erweitern, durch die Prozesse nun mit Hilfe einer Semaphore beim Lesen von der Tastatur blockieren, falls keine Taste gedrückt wurde. Erweitert euer Programm
dahingehend, dass einer der Prozesse Tastaturabfragen
vornimmt (und in irgendeiner sichtbaren Weise darauf reagiert).
Teil c: Anschließend können die Klassen Bell und Bellringer implementiert und getestet werden. Von Bellringer
sollte eine globale Instanz bellringer in main
angelegt werden. Wenn klar ist, dass insbesondere der Bellringer
funktioniert wie er sollte, könnt ihr die Klassen Buzzer und Guarded_Buzzer erstellen.
Damit lassen sich nun sehr einfach periodische Prozesse erstellen, indem ein Prozess sich immer wieder für ein paar msec schlafen legt und dann z.B. eine Ausgabe macht. Auch dafür sollt ihr ein geeignetes Beispiel vorbereiten.
Vorgaben
Die Implementierung der Klasse List haben wir bereits für Euch
erledigt.