Справочник Ada 2005
9.10 Общие переменные
Статическая семантика
Если два разных объекта, включая непересекающиеся части одного объекта, независимо адресованы, ими могут одновременно манипулировать две разные задачи без синхронизации. Обычно любые два непересекающихся объекта независимо адресованы. Однако, если для данного составного объекта указаны упаковка, расположение записей или Component_Size, то определяется ли реализацией, независимо адресованы ли две непересекающиеся части этого составного объекта.
Динамическая семантика
Отдельные задачи обычно выполняются независимо и одновременно друг с другом. Однако взаимодействия задач могут использоваться для синхронизации действий двух или более задач, чтобы, например, обеспечить осмысленную коммуникацию путем прямого обновления и чтения переменных, общих для задач. Действия двух разных задач синхронизируются в этом смысле, когда действие одной задачи сигнализирует действие другой задачи; действие A1 определено как сигнализирующее действию A2 при следующих обстоятельствах:
- Если A1 и A2 являются частью выполнения одной задачи, и правила языка требуют выполнения A1 перед A2;
- Если A1 является действием активатора, который инициирует активацию задачи, а A2 является частью выполнения активированной задачи;
- Если A1 является частью активации задачи, а A2 является действием ожидания завершения активации;
- Если A1 является частью выполнения задачи, а A2 является действием ожидания завершения задачи;
- Если A1 является завершением задачи T, а A2 — либо вычисление выражения T'Terminated, либо вызов Ada.Task_Identification.Is_Terminated с фактическим параметром, идентифицирующим T (см. C.7.1);
- Если A1 является действием выдачи вызова входа, а A2 является частью соответствующего выполнения соответствующего entry_body или accept_statement.
- Если A1 является частью выполнения accept_statement или entry_body, а A2 — действием возвращения из соответствующего вызова входа;
- Если A1 является частью выполнения тела защищённой процедуры или entry_body для данного защищённого объекта, а A2 является частью последующего выполнения entry_body для того же защищённого объекта;
- Если A1 сигнализирует некоторое действие, которое в свою очередь сигнализирует A2.
Ошибка выполнения
Если действие присваивания объекту и действие чтения или обновления части того же объекта (или смежного объекта, если они не независимо адресованы), то выполнение действий является ошибочным, если действия не являются последовательными. Два действия являются последовательными, если выполняется одно из следующих условий:
- Одно действие сигнализирует другое;
- Оба действия происходят как часть выполнения одной задачи;
- Оба действия происходят в рамках защищённых действий над тем же защищённым объектом, и не более одного из действий является частью вызова защищённой функции защищённого объекта.
Предикат pragma Atomic или Atomic_Components также может быть использован для обеспечения последовательности определённых чтений и обновлений — см. C.6.