9.4 входы задач и операторы принятияПонятие входа в задаче предназначено для организации взаимодействия задач. Внешне описание входа аналогично описанию подпрограммы : ENTRY Имя_Входа [ ( Индекс_Входа) ] [ ( Раздел_Формальных_Параметров ) ] ; D Пример описания входов : entry Wait; - - вход без параметров только для синхронизации entry Bus ( 1 .. 4 ); - - семейство входов entry Data (X : in integer); - - вход для приема информации entry Resoult (X , Y : in Vector; Z : out Matrix ); entry Buffer_Read ( Number) ( Element : out Item ); - - семейство - - входов Описание входов задачи выполняется в ее спецификации. П Пример спецификации задачи с описанием ее входов : in out Train ) Train); task Station is entry Way_A(X: entry Way_B(Y: end Station; Входы задач могут быть описаны как семейство входов. Семейство входов образуют несколько входов задачи, имеющиех одно имя и различающихся индексом, который указывается при вызове необходимого входа мз семейства. D Например: - - 10 входов Plain ); task Airoport is 10)(P: in out entry Plan_Place (1 end Airoport ; Раздел формальных параметров в описании входа может отстутство-вать, если вход используется только для синхронизации задач без передачи инфоормации. Описание раздела формальных параметров входа аналогично описанию процедур, то есть необходимо указать имя па- раметра, его вид (in , out, in out) и тип. Вид параметра здесь определяет направление движения значения этого параметра при взаимодействии задач: • из вызывающей задачи в принимающую ( in ); • из принимающей задачи в вызывающую ( out ). Взаимодействи задач основано на вызове входов задач. Оператор вызова входа подобен оператору вызова процедуры. В вызывающей задаче указывается составное имя , включающее имя вызываемой задачи и имя входа, а также индекс для семейства входов. Далее размещается список фактических параметров, если они имеются. D Например : Station . Way_B ( Berlin ); Airoport. Plain_Place (k ) ( New_Raice); Согласование формальных и фактических параметров в операторе вызова входа осуществляеттся также как и для подпрограмм. Оператор принятия ( accept) задает действия, которые выполняются вызываемой задачей при вызове данного входа. Оператор принятия неразрывно связан с соответствующим описанием входа, то есть если в спецификации задачи описаны входы, то в теле этой задачи могут быть использованы операторы принятия для этих входов. Оператор принятия определяет действия принимающей задачи во время рандеву. Общий вид оператора принятия: ACCEPT Имя_Входа [ ( Индекс_Входа ) 1 [ ( Раздел _Параметров ) ] [ DO ] ... - - Последовательностъ_Операторов [ EXCEPTION) - - тело оператора приема ... - -Исключения END [ Имя_Входа }; Индекс_Входа связан с семейством входов. Раздел_Параметров должен совпадать с разделом параметров в описании соответствующего входа. Использование оператора принятия допускается только в теле соответствующей задачи. D Например: 91 Глава 9. Задачи
90 Ада 95. Введение в программирование
accept Receiver; - - тело отсутствует ( вырожденное ) accept ln_Box(X: in Integer; Y : in Float ) do Data : = X ; Temp : = Y ; end ln_Box ; accept Fast ; accept Port ( Id) ( From : in Data ) do X : = From ; end Por t; accept Gent do put ( "Task is called"); end Gent; accept Base ( Z : inout integer ) do exception when Constrain_Error = > 2: = Integer' Last; end Base; Тело задачи может содержать несколько операторов принятия одного и того же входа. Тело оператора приема может быть пустым, либо содержать несколько операторов, даже если вход не имеет параметров . В теле разрешается использование операторов return и requeue, вызывать подпрограммы, внутри которых имеются операторы вызова входов других задач. Выполнение оператора приема начинется с вычисления индекса входа ( если рассматривается семейство входов ). Этот индекс определяет, какой из входов семейства должен выполняться. Затем выполнение тела блокируется до тех пор, пока не произойдет вызов соответствующего входа в вызывающей задаче. После этого через фактические параметры принимаются значения из вызывающей задачи, выполняется последовательность операторов из тела оператора accept и передаются значения из принимающей задачи в вызывающую. Вход задачи считается открытым, если задача блокирована на операторе приема, соответствующему данному входу ( или на операторе отбора Select с открытой альтернативой ). Иначе вход считается закрытым. При вызове открытого входа в принимающей задаче выполняется тело соответствующего оператора приема. Если вызываемый вход закрыт, то вызов данного входа добавляется в очередь к этому входу, а задача - блокируется до тех пор, пока вызов не будет исключен . Вызов входа завершенной задачи вызывает исключение Task-ing_Error в точке вызова. Ш СОВЕТЫ: •. Минимизируйте время выполнения тела оператора приема Accept ± Минимизируйте количество операторов Accept и Select в теле задачи. •. Минимизируйте количество опреаторов Accept, связанных с одним входом. » Чаще используйте обработку исключения Tasking_Error. • Используйте механизм рандеву, если создаваемые приложения требуют взаимодействия задач без буферизации. |
| Оглавление| |