Ада-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

    select

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

    . . . end Service_1; . . . -- дополнительная последовательность инструкций, -- которая выполняется после принятия рандеву -- на входе Service_1 or

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

    . . . end Service_2; or

    . . . or

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

    . . . end Service_N; or

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

    end loop; end Server_Task;

    Как видно из исходного текста примера, инструкции принятия рандеву указываются как альтернативы выбора инструкции отбора (это несколько подобно инструкции case).

    В данном случае при выполнении инструкции отбора задача-сервер циклически "опрашивает" свои входы на наличие вызова рандеву от задач-клиентов (без блокировки в состоянии ожидания вызова рандеву на каком-либо входе).

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

    После обнаружения вызова выполняется соответствующая альтернатива (примечание: завершение обработки альтернативы приводит к завершению инструкции отбора).

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

    Другими словами, когда инструкция отбора помещена в тело цикла, при одновременном появлении двух и более вызовов рандеву, инструкция отбора будет осуществлять обработку только одного вызова рандеву в течение одного "витка" цикла, а одновременно поступившие вызовы рандеву будут поставлены в очередь порядок которой не определяется стандартом.


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