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


         

Защищенные входы и барьеры - часть 2


/p>

Здесь предусмотрен циклический буфер, который позволяет сохранить до 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.

Важно понять, что здесь нет задачи, которая непосредственно ассоциирована с самим буфером.

Вычисление барьеров эффективно выполняется системой времени выполнения.

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




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