Beim Erzeuger- / Verbraucherproblem produziert ein Erzeuger Güter, die er
in einem Raum lagert. Der Lagerraum hat nur eine begrenzte Kapazität.
In dem folgenden Beispiel können im Lagerraum nicht mehr als drei Güter
aufbewahrt werden. Ein Verbraucher entnimmt die Güter aus dem Lagerraum
und verbraucht sie anschließend. Ein Problem besteht darin, daß das Lagern
und die Entnahme der Waren nicht gleichzeitig stattfinden darf. Das heißt,
das Betreten des Lagerraums muß für den Erzeuger und den Verbraucher unter
wechselseitigem Ausschluß geschehen. Natürlich muß auch eine
Reihenfolge eingehalten werden, der Erzeuger muß zuerst
produzieren und lagern, bevor der Verbraucher entnehmen und verbrauchen kann.
Der Erzeuger sollte allerdings auch nicht mehr produzieren können, als er
lagern kann.
Das folgende Applet veranschaulicht dieses Problem:
Dieses Problem kann mit Hilfe von drei Semaphoren gelöst werden. Der erste
Semaphor bestimmt, wieviele Güter gelagert werden können. Der zweite Semaphor
setzt die Reihenfolge durch, der dritte regelt den wechselseitigen Ausschluß
für den Zugriff auf den Lagerraum.
Die rosafarbenen Quadrate stellen die Semaphore dar.
Sie müssen zunächst durch Anklicken der Felder S0.INIT(3), S1.INIT(0) und
S2.INIT(1) initialisiert werden. Daraufhin erscheinen bei jedem Semaphor drei Zahlen. Die kleine Zahl
links oberhalb des Semaphors kennzeichnet seine Nummer. Die große Zahl rechts
innerhalb gibt seinen count-Wert an, und die kleine Zahl links unten sagt aus, wieviele
Prozesse sich im Warteraum des Semaphors befinden.
Nach der Initialisierung können die Programmschritte der beiden Prozesse, die grau
unterlegt und im unteren Feld dargestellt sind, angeklickt werden. Die einzelnen
Programmschritte können nur in der angegebenen Reihenfolge abgearbeitet werden. So
muß der Erzeuger immer erst die Funktion "S0.P(1)" ausführen, bevor er
die "erzeugt"-Funktion ausführen kann. Anschließend muß er die
Funkton "S2.P(1)" ausführen usw.
Der zuletzt bearbeitete Programmschritt der Prozesse wird durch einen
kleinen Pfeil gekennzeichnet.
Das Feld, das zuletzt angeklickt wurde, wird gelb hinterlegt.