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


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


Когда управление в задаче достигает оператора отбора, то, во-первых, вычисляются все условия и те альтернативы, для которых условия истинны, считаются ОТКРЫТЫМИ. Затем среди открытых альтернатив рассматриваются ОПЕРАТОРЫ ПРИЕМА, для которых очередь вызовов соответствующих входов непуста. Если такие найдутся, то произвольным образом выбирается одна из таких альтернатив, происходит соответствующее рандеву, затем выполняется последовательность операторов, расположенная за этой отобранной альтернативой, и оператор отбора считается выполненным. Если же среди открытых альтернатив нет операторов приема, готовых к рандеву, то выполняется ОПЕРАТОР ЗАДЕРЖКИ на указанное количество секунд (если за это время возникает готовность к рандеву у открытых операторов приема, то отбирается альтернатива, готовая к рандеву и оператор отбора завершается как обычно). После задержки и выполнения соответствующей выбранной альтернативе последовательности операторов оператор отбора считается выполненным. Если одна из открытых альтернатив - оператор завершения (terminate), то (если нет готовых к рандеву операторов приема), при определенных дополнительных условиях задача может быть завершена (до этого должны, в частности, завершиться так называемые подчиненные задачи, запущенные завершаемой задачей).

Альтернатива else может быть выбрана, если нет открытых операторов приема, готовых к рандеву.

В нашем случае - две альтернативы. Одна всегда открыта, вторая - только когда в очереди есть клиенты. Так что ставить в очередь можно всегда, а брать можно, естественно, когда есть что брать.

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


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