Языки программирования. Практический сравнительный анализ


Языки программирования. Практический сравнительный анализ - стр. 235


То же при последовательных вызовах из С, если клиенты есть.

Может быть и так, что задача С ждет рандеву, и очередь непуста, но все время поступают новые разборы и монитор обслуживает задачу А. Чтобы такого не случалось, цикл в задаче "буфер" должен выполняться по возможности быстро. Тогда "буфер" будет всегда успевать и принимать разборы, и выдавать их задаче С. Возможна такая ситуация, когда задача С хдет рандеву с "буфером", а "буфер" ждет рандеву с задачей А - нет клиентов. Тогда ожидание будет до тех пор, пока не появится вызов входа стань_в_очередь. Выберется соответствующая альтернатива и на следующем выполнении цикла альтернатива для задачи С окажется открытой и сможет конкурировать с первой альтернативой.

Итак, задача-монитор полностью воплощает в себе дисциплину обслуживания. В данном случае - относительно равноправный доступ к очереди со стороны А и С. Монитор полностью гарантирует взаимное исключение с развязкой.

Замечание.

Осталось пояснить, зачем нужно дополнительное условие отбора во второй альтернативе.

Действительно, если постановка в очередь не будет обслуживаться достаточно долго, то в результате входное сообщение окажется пропущенным. [Как это может случиться? ]

Чтобы избежать такой неприятности, нужно гарантировать выбор первой альтернативы, как только появляется вызов входа "стань_в_очередь". В соответствии с семантикой оператора отбора это можно сделать, защитив  вторую альтернативу дополнительным условием "нет вызова входа стань_в_очередь".

Но для этого нужно иметь возможность проверить, имеется ли  такой вызов! Другими словами, нужно иметь доступ к подходящему атрибуту этого входа. Для подобных целей в Аде предусмотрена атрибутная функция вида

                                                                         Р'счетчик,

где Р - имя входа некоторой задачи. Ее результат - количество вызовов, ожидающих обслуживания этим входом. Так что условие перед второй альтернативой следует записать в виде




- Начало -  - Назад -  - Вперед -