В данном примере интересную ситуацию
В данном примере интересную ситуацию представляет альтернатива принятия рандеву на входе Stop.
В этом случае происходит выход из бесконечного цикла выполнения инструкции отбора, что, в свою очередь, приводит к завершению работы задачи-сервера.
Если в процессе завершения работы задачи-сервера поступит вызов рандеву на какой-либо из входов Service_1 - Service_N, то задача-клиент, вызывающая рандеву, скорее всего получит исключение Tasking_Error.
Недостаток такого подхода состоит в том, что завершение работы задачи-сервера требует явного указания вызова рандеву на входе Stop.
Чтобы избавиться от необходимости явного указания вызова рандеву на входе Stop, можно использовать инструкцию отбора, в которой указывается альтернатива завершения задачи:
task Server_Task is
entry Service_1 [ параметры для Service_1 ] ; . . . entry Service_N [ параметры для Service_N ] ; end task;
task body Server_Task is
. . . begin
loop
select
accept Service_1 [ параметры для Service_1 ] do
. . . end Service_1; or
. . . or
accept Service_N [ параметры для Service_N ] do
. . . end Service_N; or
terminate; -- завершение работы задачи end select
end loop; end Server_Task;
|
В таком случае альтернатива завершения задачи будет завершать работу задачи-сервера, когда отсутствуют вызовы рандеву и отсутствуют задачи-клиенты, которые потенциально способны вызвать рандеву с задачей-сервером.
Таким образом, для завершения работы задачи-сервера не требуется явного выполнения никаких специальных действий.
Следует также учитывать, что альтернатива завершения работы задачи должна указываться последней в списке альтернатив инструкции отбора.
Может возникнуть ситуация, когда необходимо, чтобы в процессе ожидания вызова рандеву от задач-клиентов задача-сервер выполняла какие-либо дополнительные действия.
Для этого можно использовать инструкцию отбора, в которой вместо альтернативы завершения работы используется раздел
else.
Использование такого варианта инструкции отбора может иметь следующий вид:
Содержание Назад Вперед