Справочник по Ada 2012
9.5 Взаимодействие задач
Основным средством взаимодействия задач является вызов процедур и защищенных подпрограмм. Вызовы защищенных подпрограмм позволяют координировать доступ к общим данным. Вызовы процедур с входом позволяют заблокировать вызывающую задачу до тех пор, пока не будет выполнено заданное условие (а именно, пока соответствующий вход открыт — см. 9.5.3), и затем передать данные или управляющую информацию напрямую другой задаче или косвенно через общий защищенный объект.
Статическая семантика
Когда имя или префикс обозначает вход, защищенную подпрограмму или префиксный вид примитивной подпрограммы ограниченного интерфейса, первым параметром которой является управляющий параметр, то имя или префикс определяет объект-мишень следующим образом:
- Если это прямое_имя или расширенное имя, которое обозначает объявление (или тело) операции, то объектом-мишенью неявно является текущая инстанция задачи или защищенного блока, непосредственно окружающего операцию; вызов с таким именем определяется как внутренний вызов;
- Если это выбранный_компонент, который не является расширенным именем, то объектом-мишенью является объект, обозначаемый префиксом имени; вызов с таким именем определяется как внешний вызов;
- Если имя или префикс представляет собой (неявный или явный) дериференс значения типа «доступ к защищенной подпрограмме», то объект-мишень определяется префиксом атрибута доступа ссылка_на_атрибут, который изначально создал значение доступа; вызов с таким именем определяется как внешний вызов;
- Если имя или префикс обозначает объявление_переименования_подпрограммы, то объект-мишень определяется как по имени переименованного объекта.
Вызов входа или защищенной подпрограммы использует имя или префикс, неявно определяющий объект-мишень, как указано выше, или представляет собой вызов (непрефиксного вида) примитивной подпрограммы ограниченного интерфейса, первым параметром которой является управляющий параметр; в этом случае объект-мишень идентифицируется явно первым параметром. Последний случай является внешним вызовом.
Соответствующее определение объекта-мишени применяется к операции_переупорядочения (см. 9.5.4), с соответствующим различием между внутренним переупорядочением и внешним переупорядочением.
Правила допустимости
Если имя или префикс определяет объект-мишень, а имя обозначает защищенную процедуру или вход, то объектом-мишенью должна быть переменная, за исключением случая, когда префикс предназначен для ссылки_на_атрибут атрибута Count (см. 9.9).
Динамическая семантика
Внутри тела защищенной операции текущая инстанция (см. 8.6) непосредственно окружающего защищенного блока определяется объектом-мишенью, указанным (неявно или явно) в вызове (или переупорядочении) защищенной операции.
Любой вызов защищенной процедуры или входа целевого защищенного объекта определяется как обновление объекта, как и переупорядочение на таком входе.
Синтаксис
synchronization_kind ::= By_Entry | By_Protected_Procedure | Optional
Статическая семантика
Для объявления примитивной процедуры синхронизированного помеченного типа может быть указан следующий определяемый языком аспект представления с спецификацией_аспекта (см. 13.1.1):
Синхронизация
Если указан, то определение аспекта должно быть synchronization_kind.
Наследуемые подпрограммы наследуют аспект Синхронизация, если таковой имеется, от соответствующей подпрограммы родительского или предкового типа. Если переопределяющая операция не имеет непосредственно указанного аспекта Синхронизация, то аспект Синхронизация наследуемой операции наследуется переопределяющей операцией.
Правила допустимости
synchronization_kind By_Protected_Procedure не должен применяться к примитивной процедуре интерфейса задачи.
Процедура, для которой указан synchronization_kind By_Entry, должна быть реализована с помощью входа. Процедура, для которой указан synchronization_kind By_Protected_Procedure, должна быть реализована с помощью защищенной процедуры. Процедура, для которой указан synchronization_kind Optional, может быть реализована с помощью входа или процедуры (включая защищенную процедуру).
Если примитивная процедура переопределяет унаследованную операцию, для которой аспект Синхронизация указан как By_Entry или By_Protected_Procedure, то любой указанный аспект Синхронизация для переопределяющей операции должен иметь тот же synchronization_kind.
Помимо мест, где обычно применяются правила допустимости (см. 12.3), эти правила также применяются в частях описания инстанции обобщенного блока.
ПРИМЕЧАНИЯ
18 synchronization_kind By_Protected_Procedure подразумевает, что операция не будет блокироваться.