Spec-Zone.ru › Ada 2005
Справочное руководство Ada 2005

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 равно Истина. В противном случае он считается закрытым.
При выполнении оператора selective_accept оцениваются все guard условия; определяются открытые варианты. Для открытого оператора delay_alternative также вычисляется выражение задержкивыражение. Аналогично, для открытого accept_alternative для входа в семейство также вычисляется entry_index. Эти вычисления выполняются в произвольном порядке, за исключением того, что выражение задержкивыражение или entry_index не вычисляются до тех пор, пока не будет вычислено соответствующее условие, если таковое имеется.
Выбор и выполнение одного открытого варианта или части else завершает выполнение оператора selective_accept; правила такого выбора описаны ниже.
Открытые accept_alternatives рассматриваются в первую очередь. Выбор такого варианта происходит немедленно, если соответствующий вход уже имеет очереди вызовов. Если несколько вариантов могут быть выбраны, один из них выбирается в соответствии с политикой очереди входа (см. 9.5.3 и D.4). При выборе такого варианта выбранный вызов удаляется из очереди входа, и выполняется handled_sequence_of_statements (если таковой имеется) соответствующего оператора accept_statement; после завершения взаимодействия выполняется любая последующая последовательность_операторов варианта. Если немедленный выбор невозможен (в указанном выше смысле) и нет части else, задача блокируется до тех пор, пока не будет выбран открытый вариант.
Выбор других типов вариантов или части else выполняется следующим образом:
  • Открытый delay_alternative выбирается, когда достигается время его истечения, если до истечения времени не может быть выбран оператор accept_alternative или другой delay_alternative. Если несколько delay_alternative имеют одно и то же время истечения, один из них выбирается в соответствии с действующей политикой очереди (см. D.4); по умолчанию политика очереди выбирает произвольно среди delay_alternative, время истечения которых прошло.
  • Часть else выбирается и ее последовательность_операторов выполняется, если немедленно нельзя выбрать accept_alternative; в частности, если все варианты закрыты.
  • Открытый terminate_alternative выбирается, если выполнены условия, указанные в конце раздела 9.3.
Исключение Program_Error генерируется, если все варианты закрыты, и нет части else.
ПРИМЕЧАНИЯ
39 Оператор 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