Ада-95. Компилятор GNAT


         

В данном примере интересную ситуацию


В данном примере интересную ситуацию представляет альтернатива принятия рандеву на входе 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.

Использование такого варианта инструкции отбора может иметь следующий вид:


Содержание  Назад  Вперед