В следующем примере определена задача буферизации для сглаживания различий между скоростью ввода производящей задачи и скоростью ввода некоторой потребляющей задачи. Например, производящая задача может содержать операторы:
loop -— выработка следующего символа CHAR BUFFER.WRITE(CHAR); exit when CHAR = ASCII.EOT;end loop;
потребляющая задача — операторы:
loop BUFFER.READ(CHAR); -— использование символаСНАР exit when CHAR = ASCII.EOT;end loop;
Задача буферизации содержит внутренний пул для символов, обрабатываемых цикличес-ки. Пул имеет два индекса: IN-INDEX, указывающий место следующего вводимого символа, и OUT_INDEX, указывающий место следующего выводимого символа.
task BUFFER is entry READ (С : out CHARACTER); entry WRITE (C : in CHARACTER);end:task body BUFFER is POOL_SIZE : constant INTEGER := 100: POOL : array(1 .. POOL_SIZE) of CHARACTER; COUNT : INTEGER range 0 .. POOL_SIZE := 0; IN_INDEX, OUT_INDEX : INTEGER range 1 .. POOL_SIZE := 1;begin loop select when COUNT < POOL_SIZE => accept WRITE(C : in CHARACTER) do POOL(IN_INDEX) := C; end; IN_INDEX := IN_INDEX mod POOL_SIZE + 1; COUNT := COUNT + 1; or when COUNT > 0 => accept READ(C ; out CHARACTER) do C := POOL(OUT_INDEX); end; OUT_INDEX := OUT_INDEX mod POOL_SIZE + 1; COUNT := COUNT - 1; or terminate; end select: end loop:end BUFFER;