Wir werden nun an Hand eines Beispieles die verschiedenen Möglichkeiten kennenlernen, wie die Task-Kommunikation in Ada ablaufen kann. Als realistisches Beispiel nehmen wir einen mehr oder weniger gestreßten Universitätsassistenten zur Hand. Zunächst soll seine Aufgabe nur darin bestehen, Studierende, die in seinem Kämmerchen auftauchen, zu betreuen. Wir spezifizieren dazu den Task Assistent folgendermaßen:
task Assistent is
Assistent.betreue;
Die ,,Innereien`` des Assistenten-Tasks können etwa folgenderweise aussehen:
task body Assistent is
begin
loop
accept betreue do
-betreuedenStudierenden
end betreue;
end loop;
end Assistent;
Allerdings ist der Aufgabenbereich eines Universitätsassistenten damit bei weitem nicht erfaßt. Es sind nämlich nicht nur Studierende zu betreuen, sondern auch organistorische Aufgaben zu erledigen und Forschungsarbeiten durchzuführen. Wir wollen annehmen, daß unser Assistent die zu erledigenden organisatorischen Aufgaben von der Sekretärin des Instituts oder dem Institutsvorstand zugeteilt bekommt. Die Forschungstätigkeiten sollen dem Assistenten obliegen. Wir wollen annehmen, daß unser Assistent immer dann forscht, wenn er nicht durch eine der beiden anderen Aufgaben beschäftigt ist. Daher modellieren wir die organistorische Aufgabe als Entry des Assistenten-Tasks:
task Assistent is
entry betreue;
entry organisiere (Aufgabe: Aufgaben_Typ);
end Assistent;
Assistent.organisiere (Aufgabe =
Der Ablauf des Assistenten-Tasks gestaltet sich nun schon etwas schwieriger. Der Assistent muß ja jeder Zeit bereit sein, entweder einen Studierenden zu betreuen oder eine organisatorische Aufgabe zu erledigen. In Ada realisiert man das mit einer Select-Anweisung. Man nennt dann den Vorgang der Kommunikation selektives Rendezvous des Servers. Unser Beispiel hat jetzt folgendes Aussehen:
task body Assistent is
begin
loop
select
accept betreue do
-betreuedenStudierenden
end betreue;
or
accept organisiere (Aufgabe: Aufgaben_Typ) do
-organisiere
end organisiere;
end select;
end loop;
end Assistent;
Wollen wir nun auch noch erreichen, daß unser Assistent seiner Forschungstätigkeit nachkommt, so erhalten wir folgende Implementation:
task body Assistent is
begin
loop
select
accept betreue do
-betreuedenStudierenden
end betreue;
or
accept organisiere (Aufgabe: Aufgaben_Typ) do
-organisiere
end organisiere;
else
-forsche
end select;
end loop;
end Assistent;
Nach einiger Zeit erkennt unser Assistent aber, daß er buchstäblich zu keinerlei Forschungstätigkeit kommt. Er beschließt daher, Sprechstunden einzuführen, innerhalb derer er den Studierenden für ihre Probleme zur Verfügung steht. Außerhalb dieser Zeiten ignoriert er Betreuungsansuchen. Unser Assistenten-Task sieht dann so aus:
task body Assistent is
begin
loop
select
when Sprechstunde =
accept betreue do
-betreuedenStudierenden
end betreue;
or
accept organisiere (Aufgabe: Aufgaben_Typ) do
-organisiere
end organisiere;
else
-forsche
end select;
end loop;
end Assistent;
Die letzte Möglichkeit auf seiten des Assistenten, seinen Alltag zu gestalten, besteht darin, falls für eine bestimmte Zeit keine zu erledigende Aufgabe ansteht, eine Kaffeepause einzulegen. Nehmen wir an, unser Assistent wartet 1 Stunde vergebens auf zu verrichtende Aufgaben, dann lautet eine entsprechende Implementierung;
task body Assistent is
begin
loop
select
when Sprechstunde =
accept betreue do
-betreuedenStudierenden
end betreue;
or
accept organisiere (Aufgabe: Aufgaben_Typ) do
-organisiere
end organisiere;
or
delay 3600.0; -Stunde
Kaffeepause;
end select;
end loop;
end Assistent;
Die Sprache erlaubt mehrere Delay-Anweisungen innerhalb einer Select-Anweisung. Klarerweise wird dann die Anweisung mit der kürzesten Zeitspanne zuerst ausgeführt. Außerdem kann eine Select-Anweisung mit einer Delay-Anweisung keinen Else-Zweig enthalten.
Klarerweise kann statt delay auch delay until stehen.
Ada erlaubt also die folgenden vier verschiedenen Möglichkeiten
Johann Blieberger