Справочник по Ada 2012
9.10 Общие переменные
Статическая семантика
Если два разных объекта, включая неперекрывающиеся части одного объекта, независимо адресуемы, к ним можно обращаться одновременно двумя разными задачами без синхронизации. Любые два неперекрывающихся объекта независимо адресуемы, если хотя бы один из объектов указан как независимо адресуемый (см. C.6). В противном случае два неперекрывающихся объекта независимо адресуемы, за исключением случаев, когда оба являются частями составного объекта, для которого для любого из следующих аспектов представления задано несовпадающее значение: (запись) Разметка, Размер_Компоненты, Упаковка, Атомарность или Конвенция; в этом случае не определено, являются ли части независимо адресуемыми.
Динамическая семантика
Разные задачи обычно выполняются независимо и параллельно. Однако взаимодействие задач может использоваться для синхронизации действий двух или более задач, чтобы, например, обеспечить осмысленную коммуникацию путём прямого обновления и чтения переменных, общих для задач. Действия двух разных задач синхронизируются в этом смысле, когда действие одной задачи сигнализирует действие другой задачи; действие A1 определено как сигнализирующее действие A2 в следующих случаях:
- Если A1 и A2 являются частью выполнения одной задачи, и правила языка требуют выполнения A1 перед A2;
- Если A1 — действие активатора, который инициирует активацию задачи, а A2 — часть выполнения активированной задачи;
- Если A1 — часть активации задачи, а A2 — действие ожидания завершения активации;
- Если A1 — часть выполнения задачи, а A2 — действие ожидания завершения задачи;
- Если A1 — завершение задачи T, а A2 — либо вычисление выражения T'Terminated, результатом которого является True, либо вызов Ada.Task_Identification.Is_Terminated с фактическим параметром, идентифицирующим T, и результатом True (см. C.7.1);
- Если A1 — действие вызова входа, а A2 — часть соответствующего выполнения соответствующего тела_входа или оператора_приёма;
- Если A1 — часть выполнения оператора_приёма или тела_входа, а A2 — действие возврата из соответствующего вызова входа;
- Если A1 — часть выполнения тела защищённой процедуры или тела_входа для данного защищённого объекта, а A2 — часть последующего выполнения тела_входа для того же защищённого объекта;
- Если A1 сигнализирует какое-то действие, которое, в свою очередь, сигнализирует A2.
Ошибочное выполнение
При выполнении действия присваивания объекту и действия чтения или обновления части того же объекта (или соседнего объекта, если два объекта не независимо адресуемы), выполнение действий является ошибочным, если действия не являются последовательными. Два действия являются последовательными, если выполняется одно из следующих условий:
- Одно действие сигнализирует другое;
- Оба действия выполняются как часть выполнения одной и той же задачи;
- Оба действия выполняются как часть защищённых действий над одним и тем же защищённым объектом, и не более одного из действий является частью вызова защищённой функции защищённого объекта.
Аспект Атомарность или аспект Атомарные_Компоненты также могут быть заданы для обеспечения последовательности определённых чтений и обновлений — см. C.6.