Die Erörterung von Task-Entries wollen wir damit abschließen, indem wir noch erwähnen, daß es auch die Möglichkeit gibt, sogenannte Familien von Task-Entries zu bilden. Dazu benötigt man einen endlichen Bereich eines diskreten Typs. Für jedes Element dieses Bereiches kann man dann einen Task-Entry definieren, z.B.:
type Wichtigkeit is (gering, mittel, gross);
Entsprechende Aufrufe von solchen Entries sind etwa:
Nachricht.Sende (gross) (meine_Nachricht);
Nachricht.Empfange (gering) (deine_Nachricht);
Bevor wir ein Beispiel für einen Task-Body erarbeiten, wollen wir ein auf Task-Entries definiertes Attribut kennenlernen, nämlich E'COUNT. Dieses Attribut liefert die Anzahl der Tasks, die momentan in der Warteschlange des angegebenen Entry's stehen, wobei der rufende Task nicht mitgezählt wird, wenn der Aufruf des Attributes innerhalb einer Accept-Anweisung des Entry's E stattfindet.
Ein Beispiel für die Implementation eines Task-Body's für die obigen Angaben ist:
task body Nachricht is
begin
loop
select
accept Empfange(gross) (Nachricht: out Nachrichtentyp) do
-empfangeNachricht
end Empfange;
or
when Empfange(gross)'COUNT = 0 =
accept Empfange (mittel) (Nachricht: out Nachrichtentyp) do
-empfangeNachricht
end Empfange;
or
when Empfange(gross)'COUNT = 0 and
Empfange(mittel)'COUNT = 0 =
accept Empfange(gering) (Nachricht: out Nachrichtentyp) do
-empfangeNachricht
end Empfange;
-entsprechendeAccept-AnweisungenfürdieSende-Entries
end select;
end loop;
end Nachricht;
Diese Art der Programmierung ermöglicht, wie wir gerade gesehen haben, die Vergabe von Prioritäten für Task-Entries. Wie man mittels Prioritäten auf ganze Tasks einwirken kann, werden wir im folgenden Unterkapitel sehen.
Abschließend sei noch erwähnt, daß man bei der Implementierung von Familien von Task-Entries auch schreiben
accept Empfange( for N in Nachrichtentyp'RANGE) (Nachricht: out Nachrichtentyp) do
-empfangeNachricht
if N = gross then
-tuwas
elsif N = mittel then
-tuwasanderes
else
-tuwasganzanderes
end if;
end Empfange;
Johann Blieberger