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

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 в точке вызова.

Ш   СОВЕТЫ:

•. Минимизируйте время выполнения тела оператора приема Ac­cept

± Минимизируйте количество операторов Accept и Select в теле задачи.

•. Минимизируйте количество опреаторов   Accept,   связанных с од­ним входом. »  Чаще используйте обработку исключения Tasking_Error.

•  Используйте механизм рандеву, если создаваемые приложения тре­буют взаимодействия задач без буферизации.