next up previous contents index
Weiter: Programmstruktur und Übersetzungsvorgang Hinauf: Geschützte Objekte Zurück: Deklaration geschützer Objekte

Diskriminierte geschützte Objekte

 

Ähnlich wie bei Tasks ist auch hier die Möglichkeit vorhanden, geschützte Objekte durch Diskriminanten zu parametrieren.

Wir geben als ein Beispiel eine geschützte Warteschlange. Angenommen wir haben ein Warteschlangenprotokoll wie folgt gegeben:

type Queue is abstract tagged null record;
function Is_Empty(Q: in Queue) return boolean is abstract;
function Is_Full(Q: in Queue) return boolean is abstract;
procedure Add_To_Queue(
Q: access Queue;
X: Queue_Data) is abstract;
procedure Remove_From_Queue(
Q: access Queue;
X: out Queue_Data) is abstract;

Eine allgemeine geschützte Warteschlange kann nun wie folgt realisiert werden:

protected type PQ(Q: access Queue'CLASS) is
entry Put(X: in Queue_Data);
entry Get(X: out Queue_Data);
end;

protected body PQ is
entry Put(X: in Queue_Data) when not Is_Full(Q.all) is
begin
Add_To_Queue(Q,X);
end Put;

entry Get(X: out Queue_Data) when not Is_Empty(Q.all) is
begin
Remove_From_Queue(Q,X);
end Get;
end PQ;

Die ursprünglich nur zu Informationszwecken vorhandenen gewesenen Funktionen Is_Empty und Is_Full werden nun als Wächter verwendet.

Ein Benutzer kann nun seine eigene Queue implementieren, zum Beispiel durch

type My_Queue is new Queue with private;
function Is_Empty(Q: My_Queue) return boolean;
...

und kann dann eine geschützte Warteschlange wie folgt deklarieren und benutzen

Raw_Queue: aliased My_Queue;
My_Protected_Queue: PQ(Raw_Queue'ACCESS);
...
My_Protected_Queue.Put(An_Item);



Johann Blieberger
Wed Feb 11 09:58:52 MET 1998