Spec-Zone.ru › Ada 2012
Справочник Ada 2012

9.7.1 Выбор приёмника

Этот вид оператора select_statement позволяет ожидать и выбирать из одного или нескольких вариантов. Выбор может зависеть от условий, связанных с каждым вариантом оператора selective_accept.

Синтаксис

selective_accept ::=
select
[guard]
select_alternative
{ or
[guard]
select_alternative }
[ else
последовательность_операторов ]
end select;
guard ::= when условие =>
select_alternative ::=
accept_alternative
| delay_alternative
| terminate_alternative
accept_alternative ::=
оператор_приема [последовательность_операторов]
delay_alternative ::=
оператор_задержки [последовательность_операторов]
terminate_alternative ::= terminate;
Оператор selective_accept должен содержать по крайней мере один оператор accept_alternative. Кроме того, он может содержать:
оператор terminate_alternative (только один); или
один или несколько операторов delay_alternative; или
часть else (зарезервированное слово else, за которым следует последовательность_операторов).
Эти три возможности взаимоисключают друг друга.

Правила допустимости

Если оператор selective_accept содержит более одного оператора delay_alternative, то все они должны быть операторами относительной задержки delay_relative_statement или операторами задержки до определённого момента delay_until_statement для одного и того же типа времени.

Динамическая семантика

Оператор select_alternative считается открытым, если он не непосредственно предшествует оператору guard или если условие условие в операторе guard имеет значение True. В противном случае он считается закрытым.
При выполнении оператора selective_accept оцениваются все условия guard; таким образом определяются открытые варианты. Для открытого оператора delay_alternative также вычисляется выражение delay_выражение. Аналогично, для открытого оператора accept_alternative для входа в группу вычисляется также индекс_входа. Эти вычисления выполняются в произвольном порядке, за исключением того, что выражение delay_выражение или индекс_входа не вычисляются до тех пор, пока не будет вычислено соответствующее условие условие, если таковое имеется. Затем выбор и выполнение одного открытого варианта или части else завершают выполнение оператора selective_accept; правила этого выбора описаны ниже.
Открытые операторы accept_alternative рассматриваются в первую очередь. Выбор такого варианта происходит немедленно, если соответствующий вход уже имеет очереди вызовов. Если несколько вариантов могут быть выбраны, один из них выбирается в соответствии с политикой очереди ввода (см. 9.5.3 и D.4). При выборе такого варианта выбранный вызов удаляется из очереди ввода, и выполняется последовательность_обработки (если есть) соответствующего оператора оператор_приема; после завершения соединения выполняется любая последующая последовательность_операторов варианта. Если немедленный выбор невозможен (в указанном смысле) и нет части else, задача блокируется до тех пор, пока не будет выбран открытый вариант.
Выбор других форм варианта или части else выполняется следующим образом:
  • Открытый оператор delay_alternative выбирается, когда достигается время его истечения, если до времени истечения не может быть выбран оператор accept_alternative или другой delay_alternative. Если несколько операторов delay_alternative имеют это же время истечения, один из них выбирается в соответствии с политикой очереди (см. D.4); политика очереди по умолчанию произвольно выбирает среди операторов delay_alternative, время истечения которых прошло.
  • Часть else выбирается и её последовательность_операторов выполняется, если оператор accept_alternative не может быть выбран немедленно; в частности, если все варианты закрыты.
  • Открытый оператор terminate_alternative выбирается, если выполнены условия, указанные в конце подпункта 9.3.
Исключение Program_Error возникает, если все варианты закрыты и нет части else.
ПРИМЕЧАНИЯ
40 Оператор selective_accept может иметь несколько открытых delay_alternatives. Оператор selective_accept может иметь несколько открытых accept_alternatives для одного и того же входа.

Примеры

Пример тела задачи с выбором приёма:
task body Server is
Current_Work_Item : Work_Item;
begin
loop
select
accept Next_Work_Item(WI : in Work_Item) do
Current_Work_Item := WI;
end;
Process_Work_Item(Current_Work_Item);
or
accept Shut_Down;
exit; -- Запрос преждевременной остановки
or
terminate; -- Нормальная остановка в конце области видимости
end select;
end loop;
end Server;


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API