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



         

Селекция принятия рандеву


Предположим, что нам необходима задача-сервер, которая будет обслуживать множество задач-клиентов.

Предположим также, что задача-сервер должна иметь не один, а целое множество входов для предоставления различных сервисов задачам-клиентам, а один из входов будет указывать на необходимость завершения работы задачи-сервера, то есть задача-сервер должна выполняться до тех пор, пока не получит явной команды на завершение своей работы.

Вполне резонно на основе полученных ранее сведений, попытаться реализовать что-нибудь подобное следующему:

task Server_Task is

entry Service_1 [ параметры для Service_1 ] ; entry Service_2 [ параметры для Service_2 ] ; . . . entry Service_N [ параметры для Service_N ] ;

entry Stop; end task;

task body Server_Task is

. . . begin

loop

accept Service_1 [ параметры для Service_1 ] do

. . . end Service_1;

accept Service_2 [ параметры для Service_2 ] do

. . . end Service_2;

. . .

accept Service_N [ параметры для Service_N ] do

. . . end Service_N;

accept Stop do

exit ; -- выход из цикла, и, следовательно, -- завершение задачи end Stop; end loop; end Server_Task;

Однако при внимательном рассмотрении логики работы данного примера оказывается, что задача-сервер будет блокироваться (приостанавливаться) в каждой инструкции принятия рандеву, ожидая поступления вызова на соответствующем входе от какой-либо задачи-клиента.

Причем, находясь в состоянии ожидания, задача-сервер никак не будет реагировать на наличие и поступление вызовов от задач-клиентов на других входах.

Следовательно, для ситуаций, которые подобны показанной в этом примере, необходима возможность селекции (или выбора) принятия рандеву на входах задачи-сервера.

Для обеспечения селекции принятия рандеву, Ада предоставляет различные варианты инструкции отбора с ожиданием, которая задается с помощью зарезервированного слова select.

Использование инструкции отбора в теле задачи-сервера позволяет:

одновременно ожидать более одного рандеву

  • выполнять таймаут, если за указанный период времени не поступило ни одного вызова рандеву




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