OBJECT Station (next: Station);
VAR {PRIVATE}
in, out: INTEGER;
buf: ARRAY N OF OBJECT;
PROCEDURE {PRIVATE} Get (VAR x: OBJECT);
BEGIN {LOCKED}
AWAIT (in # out);
x := buf[out];
out := (out + 1) MOD N
END Get;
PROCEDURE {PUBLIC} Put (x: OBJECT);
BEGIN {LOCKED}
AWAIT (in + 1) MOD N # out;
buf[in] := x;
in := (in + 1) MOD N
END Put;
ACTIVITY;
VAR x: OBJECT;
BEGIN
LOOP
Get(x); (* далее должна идти обработка объекта x *)
next.Put(x)
END
END
BEGIN
in := 0; out := 0
END Station.
