Справочник по Ada 95
C.6 Управление общими переменными
В этом пункте описываются директивы представления, которые контролируют использование общих переменных.
Синтаксис
Форма директив Atomic, Volatile, Atomic_Components и Volatile_Components следующая:
pragma Atomic(имя_локальной_переменной);
pragma Volatile(имя_локальной_переменной);
pragma Atomic_Components(массив_имя_локальной_переменной);
pragma Volatile_Components(массив_имя_локальной_переменной);
Атомный тип — это тип, к которому применяется директива Atomic. Атомный объект (включая компонент) — это объект, к которому применяется директива Atomic, или компонент массива, к которому применяется директива Atomic_Components, или любой объект атомного типа.
Переменчивый тип — это тип, к которому применяется директива Volatile. Переменчивый объект (включая компонент) — это объект, к которому применяется директива Volatile, или компонент массива, к которому применяется директива Volatile_Components, или любой объект переменчивого типа. Кроме того, каждый атомный тип или объект также определяется как переменчивый. Наконец, если объект является переменчивым, то все его подкомпоненты также являются переменчивыми (это не относится к атомному).
Правила разрешения имен
имя_локальной_переменной в директивах Atomic или Volatile должно обозначать либо объявление_объекта, либо не наследуемое объявление_компонента, либо полное_объявление_типа. массив_имя_локальной_переменной в директивах Atomic_Components или Volatile_Components должно обозначать объявление типа массива или массивный объект анонимного типа.
Правила легальности
Недопустимо применение директив Atomic или Atomic_Components к объекту или типу, если реализация не может поддерживать неделимые чтения и обновления, требуемые директивой (см. ниже).
Недопустимо указывать атрибут Size атомного объекта, атрибут Component_Size для типа массива с атомными компонентами или атрибуты компоновки атомного компонента таким образом, чтобы это предотвращало выполнение реализацией требуемых неделимых чтений и обновлений.
Если атомный объект передаётся в качестве параметра, то тип формального параметра должен быть атомным или допускать передачу по значению (то есть не быть неатомным типом по ссылке). Если атомный объект используется в качестве фактического для генерического формального объекта с режимом in out, то тип генерического формального объекта должен быть атомным. Если префикс ссылка_на_атрибут для атрибута Access обозначает атомный объект (включая компонент), то назначенный тип результирующего типа доступа должен быть атомным. Если атомный тип используется в качестве фактического для генерического формального типа, производного от типа, то предшественник формального типа должен быть атомным или допускать передачу по значению. Соответствующие правила применяются к переменчивым объектам и типам.
Если директива Volatile, Volatile_Components, Atomic или Atomic_Components применяется к автономному константному объекту, то к нему также должна применяться директива Import.
Статическая семантика
Эти директивы являются директивами представления (см. 13.1).
Динамическая семантика
Для атомного объекта (включая атомный компонент) все чтения и обновления объекта в целом неделимы.
Для переменчивого объекта все чтения и обновления объекта в целом выполняются непосредственно в памяти.
Два действия являются последовательными (см. 9.10), если каждое из них является чтением или обновлением одного и того же атомного объекта.
Если тип является атомным или переменчивым и не является типом по значению, то тип определяется как тип по ссылке. Если любой подкомпонент типа является атомным или переменчивым, то тип определяется как тип по ссылке.
Если фактический параметр является атомным или переменчивым, а соответствующий формальный параметр нет, то параметр передаётся по значению.
Требования к реализации
Внешнее влияние программы (см. 1.1.3) определяется как включающее каждое чтение и обновление переменчивого или атомного объекта. Реализация не должна генерировать никаких чтений или обновлений памяти атомных или переменчивых объектов, кроме тех, что указаны в программе.
Если к типу применяется директива Pack, и любой из его подкомпонентов является атомным, реализация не должна упаковывать атомные подкомпоненты плотнее, чем это необходимо для поддержки неделимых чтений и обновлений.
ПРИМЕЧАНИЯ
9 Импортированная переменчивая или атомная константа ведет себя как константа (т. е. только для чтения) по отношению к другим частям Ada-программы, но может быть изменена «внешним источником».