Здесь предусмотрен циклический буфер, который позволяет сохранить до Max
значений типа Item.
Доступ обеспечивается с помощью входов Put и Get.
Описание объекта (переменной) защищенного типа осуществляется традиционным образом, а для обращения к защищенным входам, как и для обращения к защищенным подпрограммам, используется точечная нотация:
declare . . . My_Buffer: Bounded_Buffer; . . . begin . . . My_Buffer.Put(X); . . . end; |
Заметим, что так же как и в случае вызова входа задачи, вызывающая задача может использовать инструкции отбора для временного или условного вызова защищенного входа. Например:
. . . select My_Buffer.Get(X); . . . -- список инструкций else . . . -- список инструкций end select; |
Поведение защищенного типа контролируется барьерами.
При вызове входа защищенного объекта выполняется проверка соответствующего барьера.
Если значение барьера False, то вызов помещается в очередь, подобно тому, как это происходит при вызове входа задачи.
При описании переменной My_Buffer
буфер - пуст, и, таким образом, барьер для входа Put имеет значение True, а для входа Get - False.
Следовательно, будет выполняться только вызов Put, а вызов Get
будет отправлен в очередь.
В конце выполнения тела входа (или тела процедуры) защищенного объекта производится вычисление значений всех барьеров, у которых есть задачи, ожидающие в очереди, разрешая, таким образом, обработку обращений к входам, которые ранее были помещены в очередь в результате того, что значение барьера было вычислено как False.
Таким образом, после завершения обработки первого же вызова Put, если вызов Get уже находится в очереди, то значение барьера для Get будет вычислено заново, и это позволит обслужить ожидающий в очереди вызов Get.
Важно понять, что здесь нет задачи, которая непосредственно ассоциирована с самим буфером.
Вычисление барьеров эффективно выполняется системой времени выполнения.
Барьеры вычисляются когда вход вызывается впервые и когда происходит что-либо, что может повлиять на состояние барьера ожидающей задачи.