procedure SHOPPING is task GET_SALAD; task GET_WINE; task GET_MEAT; task body GET_SALAD is begin BUY_SALAD; end GET_SALAD; task body GET_WINE is begin BUY_WINE; end GET_WINE; task body GET_MEAT is begin BUY_MEAT; end GET_MEAT; begin null; end SHOPPING; procedure SHOPPING is task GET_SALAD is entry PAY (M : in MONEY); entry COLLECT (S : out SALAD); end GET_SALAD; task body GET_SALAD is CASH : MONEY; FOOD : SALAD; begin accept PAY (M : in MONEY) do CASH := M; end PAY; FOOD := BUY_SALAD (CASH); accept COLLECT (S : out SALAD) do S := FOOD; end COLLECT; end GET_SALAD; task PROTECTED_VARIABLE is entry READ (X : out ITEM); entry WRITE (X : in ITEM); end; task body PROTECTED_VARIABLE is V : ITEM; begin accept WRITE (X : in ITEM) do V := X; end; loop select accept READ( X : out ITEM) do X := V; end; or accept WRITE (X : in ITEM) do V := X; end; end select; end loop; end PROTECTED_VARIABLE; GUARDS task BUFFERING is entry PUT (X : in ITEM); entry GET (X : out ITEM); end; task body BUFFERING is N : constant := 8; A : array (1..N) of ITEM; I, J : integer range 1..N := 1; COUNT : integer range 0..N := 0; begin loop select when COUNT < N => accept PUT (X : in ITEM) do A(I) := X; end; I := I mod N + 1; COUNT := COUNT + 1; or when COUNT > 0 => accept GET (X : out ITEM) do X := A(J); end; J := J mod N + 1; COUNT := COUNT - 1; end select; end loop; end BUFFERING;
Copyright ©2014, G. Hill Price
Send comments to G. Hill Price