---------------------------------------------------------------------- -- Readers-Writers Demo, mit simpler integer-Variablen -- -- Version 2: control task in package => *no* preference for writer, -- potentially blocking ops allowed ---------------------------------------------------------------------- with Stringpack; use Stringpack; procedure Readers_Writers2a is package Variable is procedure Write (X : Integer); function Read return Integer; end Variable; package body Variable is V : Integer := 0; -- na ja task Control is entry Start_Read; entry Finish_Read; entry Start_Write; entry Finish_Write; end Control; task body Control is Readers, Writers : Natural := 0; begin loop select when Writers = 0 => -- no writer inside, no preference for writers accept Start_Read; Readers := Readers + 1; or accept Finish_Read; Readers := Readers - 1; or when Readers = 0 and Writers = 0 => -- nobody inside accept Start_Write; Writers := 1; or accept Finish_Write; Writers := 0; or terminate; end select; end loop; end Control; procedure Write (X : Integer) is begin Control.Start_Write; V := X; Control.Finish_Write; end Write; function Read return Integer is X : Integer; begin Control.Start_Read; X := V; Control.Finish_Read; return V; end Read; end Variable; task type Reader; task body Reader is Local_X : Integer; begin for I in 1..100000 loop Local_X := Variable.Read; end loop; Print("> " & Local_X); end Reader; task type Writer; task body Writer is Local_X : Integer := 1; begin for I in 1..100000 loop Variable.Write(Local_X); Local_X := Local_X + 1; end loop; end Writer; Anz_R, Anz_W : Natural; begin Print("give #readers, #writers"); Anz_R := Getint; Anz_W := Getint; declare R : array(1..Anz_R) of Reader; W : array(1..Anz_W) of Writer; begin null; end; end Readers_Writers2a;