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-Структура программы и раздельная компиляция |
| Оглавление| |