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