Aufgabe 6: Ereignisbearbeitung und Synchronisation
Lernziel
Synchronisation mit Hilfe von Semaphoren und anderen Kernobjekten
Aufgabenbeschreibung
OOStuBS soll nun um Synchronisationsobjekte erweitert werden, mit denen Threads sich gegenseitig über verschiedene 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.
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 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 Millisekunden 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.