10. Parallele Prozesse
 
zurück
10.7.2 Attribute von Prozessen


Folgende Attribute können auf jedes Prozeßobjekt angewendet werden:
  • T'callable
  • T'terminated
Das Attribut "T'callable" liefert den Wert "true" vom Datentyp Boolean, wenn ein Prozeß mittels eines Eingangsaufrufes aufrufbar ist. Es liefert den Wert "false", wenn der Prozeß nicht mehr mittels eines Eingangsaufrufes aufrufbar ist. Ein Prozeß ist genau dann nicht mehr aufrufbar, wenn sein Zustand ausgeführt, beendet oder anormal ist.

Das Attribut "T'terminated" liefert den Wert "true" vom Datentyp "Boolean", wenn der Prozeß beendet ist, andernfalls den Wert "false".


Beispiel:

Wird zwischen der ersten Schleife mit der Übergabe der Initialwerte an die Prozesse und der zweiten Schleife mit der Abfrage bzw. Ausgabe der Ergebnisse folgende Schleife eingefügt,

for index in prozesse’range loop
   if prozesse( index )’callable then
      text_io.put_line( "aufrufbar" );
   else
      text_io.put_line( "nicht aufrufbar" );
   end if;
end loop;


so wird zehnmal die Meldung "aufrufbar" ausgegeben.

Attribut "E'count"

Das Attribut "E'count" kann aus jedem Prozeßrumpf auf die Eingänge dieses Prozesses angewendet werden. Mit diesem Attibut wird abgefragt, wieviele Eingangsaufrufe an dem jeweiligen Eingang anstehen.


Beispiel:

with text_io;
with berechnung;
package body types7 is

   task body parallel_berechnung is
      i : integer := -1;
      f : float := 0.0;
   begin
      accept input( x : in integer ) do
         i := x;
      end input;
      f := berechnung( i );

      loop -- Diese Schleife wird nicht abgebrochen, bis ein Prozess
           -- das Ergebnis abfragt.
         exit when output'count > 0; -- Abbruchbedingung.
         delay 0.05; -- Notwendig fuer bestimmte Zuteilungsverfahren.
      end loop;
      accept output( x : out float ) do
         x := f;
      end output;

   end parallel_berechnung;
end types7;


Die Endlosschleife bricht genau dann ab, wenn ein anderer Prozeß den Eingang "output" aufruft. Die Ausgabe mittels "text_io.put_line(...)" ist nicht notwendig, sie demonstriert aber beim Ablauf des Programms anschaulich, in welcher Reihenfolge den Prozessen vom Zuteilungsverfahren die Prozessorkapazität zugeteilt wird. Die Verzögerungsanweisung "delay 0.05" ist notwendig, falls das Zuteilungsverfahren kein preemptives Multitasking unterstützt. Bei diesem Zuteilungsverfahren kann nur dann die Prozessorkapazität einem anderen Prozeß zugeordnet werden, wenn der gerade aktive Prozeß sie (freiwillig) abgibt. Fehlte die Anweisung bei diesem Zuteilungsverfahren, so könnte die Endlosschleife nie abbrechen, da kein anderer Prozeß aktiv werden könnte, um den Eingang des aktiven Prozesses aufzurufen. Auch bei einem Zeitscheibenverfahren ist die Anweisung nützlich, da es Vergeudung von Rechnerkapazität ist, wenn ein Prozeß das ihm zugeteilte Zeitintervall in einer Endlosschleife verbrächte.

Im folgenden Beispiel soll ein Prozeß solange Eingangsaufrufe mit der Übergabe von Werten akzeptieren, bis er explizit durch einen anderen Eingangsaufruf gestoppt wird. Damit im Falle eines Stoppens andere Aufrufer nicht vergeblich lange in ihren bereits abgesetzten Eingangsaufrufen "hängen" bleiben, sollen nach dem Stoppen alle wartenden Aufrufer akzeptiert werden, ohne daß deren Werte verarbeitet werden:

package Server_Management is
   task Server is
      entry Eingang (Wert : in INTEGER);
      entry Stop;
   end Server;
end Server_Management;

package body Server_Management is
   task body Server is
   begin
      loop
         select
            accept Eingang (Wert : in INTEGER) do
               -- ... irgendeine Verarbeitung des Werts
               null;
            end Eingang;
         or
            accept Stop;
            exit;
         end select;
      end loop;

      while Eingang'Count > 0 loop           -- (fast) alle anderen Eingangs-
         accept Eingang (Wert : in INTEGER); -- aufrufe weglesen und damit
      end loop;                              -- die Aufrufer loslassen
   end Server;
end Server_Management;



 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.