Введение в программирование - Учебное пособие (Корочкин А. В.)

12.3 примеры

П Пример 1.

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

protected   Next    is      - - спецификация защищенного модуля

out  Positive ); - - защищенные out   Positive ); - -  процедуры

- -  общая   переменная

procedure   Add ( Value procedure   Sub ( Value

private

Counter  :   Integer: = 0 ;

end   Next;

- - тело защищенного модуля out  Positive )  is

1

protected body  Next  is procedure  Add (Value : begin

Counter: =   Counter + Value    : =   Counter; end Add;

procedure  Sub (Value :   out  Positive )   is begin

Counter: =   Counter -1 ; Value    : =   Counter; end Sub; end    Next;

Counter

Next :

Задачи увеличивают или уменьшают значение переменной , вызывая процедуры Add и   Sub    из    защищенного модуля Next. Add ( z);      Next. Sub ( v);

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

П Пример 2.

Защищенный модуль С21 выполняет роль буфера, куда задачи А и В записывают и считывают данные. Защищенный модуль С21 должен

Глава 12. Защищенные модули

145

144

Ада 95. Введение в программирование

 

обеспечить  синхронизированный  доступ  задач  к  общему  ресурсу, которым является переменная Bank.

protected     C21    is

entry    ln_Bank    (X :   in   Elem );

entry    Out_ Bank (Y : out  Elem ); private

Flag   :    Boolean : =  False ;

Bank   :     Elem;  - -    общая   переменная end    C21 ;

protected body   C21    is

entry   ln_Bank (X :   in   Elem )      when    Flag = False    is

Bank: = Elem ;

Flag : = True ; end   ln_Bank;

entry   Out_Bank (Y : out   Elem )   when Flag = True    is

Elem : =     Bank;

Flag   : =     False ; end  Out_Bank;

end   C21;

task A; task B;

task    body    A   is

С 21. ln_Bank ( Data);       - - вызов входа end   A;

task   body В is

C21.Out_Bank(Res); end В ;

П Пример З. Настраиваемый пакет для работы с буфером [ 12 ].

generic

type   Item    is   private;     - - параметры  настройки Maximum_Buffer_Size   :   in Positive;

package   BOUNDED_BUFFER_PACKAGE     is

subtype Bufferjndex   is   Positive  range

1 ..    Maximum_Buffer_Size ; subtype Buffer_Count  is   Natural   range

0.. Maximum_Buffer_Size ; type       Buffer_Array   is   array  ( Bufferjndex)   of   Item;

protected   type Bounded_Buffer is - - защищенный тип entry Get ( X : out Item );  - - защищенные входы entry Put ( X : in Item );

private

Getjndex  :   Bufferjndex : =   1 ;       - - приватная часть Putjndex   :   Bufferjndex : =   1 ;

Count         :   Buffer_Count : = 0 ; Data       :   Buffer_Array;

end    BoundedJBuffer; end    BOUNDED_BUFFER_PACKAGE; package   body   BOUNDED_BUFFERJ=>ACKAGE   is

protected   body    BoundedJ3uffer  is   - - тело защищенного

- -  типа

146

Ада 95. Введение в программирование

 

 

147

entry  Get(  X :    out    Item)

when   Count => 0 is  - - тело - - защищенного     входа с барьером begin

Х:= Data (Getjndex);

Getjndex : = (Getjndex mod Maximum_Buffer_Size) + 1; Count: =  Count -1 ; end Get;

entry  Put( X :   in Item)

when Counr < MaximumJ3uffer_Size  is begin      - - тело защищенного входа

Data ( Getjndex) : = X ;      - -           c барьером Put Jndex : = ( Putjndex mod MaximumJ3uffer_Size) + 1 ; Count: =   Count + 1 ; end    Put;

end   Bounded_Buffer; end   BOUNDEDJSUFFEFLPACKAGE;

Глава 13-Структура программы и раздельная компиляция