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



         

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


Основопологающая концепция защищенных объектов подобна мониторам.

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

Однако защищенные объекты, по сравнению с мониторами, обладают большим преимуществом: протокол взаимодействия с защищенными объектами описывается барьерными условиями (в правильности которых достаточно легко убедиться), а не низкоуровневыми и неструктурируемыми сигналами, используемыми в мониторах (как в языке Modula).

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

Защищенные модули позволяют осуществлять очень эффективную реализацию различных сигнальных объектов, семафоров и подобных им парадигм:

-- спецификация защищенного типа protected type Counting_Semaphore (Start_Count : Integer := 1) is

entry Secure; procedure Release; function Count return Integer;

private

Current_Count : Integer := Start_Count;

end;

-- тело защищенного типа protected body Counting_Semaphore is

entry Secure when Current_Count > 0 is

begin

Current_Count := Current_Count - 1; end;

procedure Release is

begin

Current_Count := Current_Count + 1; end;

function Count return Integer is

begin

return Current_Count; end;

end Counting_Semaphore;

Особенностью этого примера является то, что Start_Count является дискриминантом.

При вызове входа Secure опрашивается барьер этого входа.

Если результат опроса барьера есть False, то задача ставится в очередь, а ожидание обслуживания становится True.

Следует заметить, что этот пример демонстрирует реализацию общего семафора Дейкстры (Dijkstra), где вход Secure и процедура Release

соответствуют операциям P и V (Dutch Passeren и Vrijmaken), а функция Count возвращает текущее значение семафора.

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

Так же как и в случае с очередями к входам задач, очереди к входам защищенных объектов обслуживаются в порядке поступления вызовов (FIFO - First-In-First-Out).

Однако в случае поддержки требований приложения D (Annex D) стандарта Ada95, в котором указываются требования для систем реального времени, допускается использование другой дисциплины обслуживания очереди.

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

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

Индекс семейства может использовать барьер, ассоциируемый с таким входом (обычно такой индекс используется в качестве индекса массива значений логического типа Standard.Boolean).




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