9.12. ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАДАЧИ

В следующем примере определена задача буферизации для сглаживания различий между скоростью ввода производящей задачи и скоростью ввода некоторой потребляющей задачи. Например, производящая задача может содержать операторы:

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;