Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

9.10.1 Политики проверки конфликтов

Этот подраздел определяет, какие проверки выполняются в отношении возможных одновременных конфликтующих действий (см. 9.10).

Синтаксис

Форма директивы Conflict_Check_Policy имеет следующий вид:
pragma Conflict_Check_Policy (policy_идентификатор[, policy_идентификатор]);
Директива pragma Conflict_Check_Policy разрешена только непосредственно внутри раздела_объявлений, спецификации_пакета или в качестве конфигурационной директивы.

Правила допустимости

Каждый policy_идентификатор должен быть одним из No_Parallel_Conflict_Checks, Known_Parallel_Conflict_Checks, All_Parallel_Conflict_Checks, No_Tasking_Conflict_Checks, Known_Tasking_Conflict_Checks, All_Tasking_Conflict_Checks, No_Conflict_Checks, Known_Conflict_Checks, All_Conflict_Checks или политикой проверки конфликтов, определенной реализацией. Если задано два policy_идентификатора, один должен включать слово Parallel, а другой — слово Tasking. Если задан только один policy_идентификатор, он не должен содержать слов Parallel или Tasking.
Директива pragma Conflict_Check_Policy, заданная в разделе_объявлений или непосредственно внутри спецификации_пакета, применяется от места директивы до конца самого внутреннего содержащего раздела объявлений. Область применения pragma Conflict_Check_Policy, заданной как конфигурационная директива, — это раздел объявлений для всего модуля компиляции (или модулей), к которому она применяется.
Если pragma Conflict_Check_Policy применяется к генерируемой_инстанциации, то pragma Conflict_Check_Policy применяется к всей инстанции.
Если к данному конструкту применяется несколько директив Conflict_Check_Policy, политика проверки конфликтов определяется той, что находится в самом внутреннем содержащем разделе. Если к конструкту не применяется никакая директива Conflict_Check_Policy, политика равна (All_Parallel_Conflict_Checks, No_Tasking_Conflict_Checks) (см. ниже).
Некоторые потенциально конфликтующие действия запрещены в зависимости от политики проверки конфликтов, которая применяется в месте, где происходит действие или действия, как указано ниже:
No_Parallel_Conflict_Checks

Эта политика не накладывает никаких ограничений на одновременные действия, возникающие из параллельных конструкций.
No_Tasking_Conflict_Checks

Эта политика не накладывает никаких ограничений на одновременные действия, возникающие из задач.
Known_Parallel_Conflict_Checks

Если эта политика применяется к двум одновременным действиям, появляющимся в параллельных конструкциях, они запрещаются, если известно, что они обозначают один и тот же объект (см. 6.4.1) с конфликтующими использованиями. Для целей этой проверки любая параллельная петля может предполагаться как включающая несколько одновременных итераций. Также для определения того, являются ли два действия одновременными, достаточно, чтобы логические потоки управления, в которых они происходят, были одновременными в любой момент их выполнения, если не выполняются все следующие условия:
объект является переменной volatile;
два логических потока управления оба известны как также ссылающиеся на общий синхронизированный объект; и
каждый поток, чье потенциально конфликтующее действие обновляет общий объект volatile, также обновляет этот общий синхронизированный объект.
Known_Tasking_Conflict_Checks

Если эта политика применяется к двум одновременным действиям, появляющимся в одном и том же модуле компиляции, по крайней мере одно из которых появляется в теле задачи, но не в параллельной конструкции, они запрещаются, если известно, что они обозначают один и тот же объект (см. 6.4.1) с конфликтующими использованиями, и ни одно из них не может сигнализировать о другом (см. 9.10). Для целей этой проверки любой именованный тип задачи может предполагаться как имеющий несколько экземпляров. Также для определения того, являются ли два действия одновременными, достаточно, чтобы задачи, в которых они происходят, были одновременными в любой момент их выполнения, если не выполняются все следующие условия:
объект является volatile;
две задачи оба известны как также ссылающиеся на общий синхронизированный объект; и
каждая задача, чье потенциально конфликтующее действие обновляет общий volatile-объект, также обновляет этот общий синхронизированный объект.
All_Parallel_Conflict_Checks

Эта политика включает ограничения, налагаемые политикой Known_Parallel_Conflict_Checks, а также запрещает параллельной конструкции чтение или обновление переменной, которая глобальна для конструкции, если это не синхронизированный объект, или если конструкция — это параллельная петля, и глобальная переменная — это часть компонента массива, обозначаемого индексированным компонентом с, по крайней мере, одним выражением индекса, которое статически обозначает параметр петли loop_parameter_specification или параметр блока параллельной петли.
All_Tasking_Conflict_Checks

Эта политика включает ограничения, налагаемые политикой Known_Tasking_Conflict_Checks, а также запрещает телу задачи чтение или обновление переменной, которая глобальна для тела задачи, если это не синхронизированный объект.
No_Conflict_Checks, Known_Conflict_Checks, All_Conflict_Checks

Это сокращения соответственно для (No_Parallel_Conflict_Checks, No_Tasking_Conflict_Checks), (Known_Parallel_Conflict_Checks, Known_Tasking_Conflict_Checks) и (All_Parallel_Conflict_Checks, All_Tasking_Conflict_Checks).

Статическая семантика

Для подпрограммы можно указать следующую языковую аспект:
Parallel_Calls

Аспект Parallel_Calls имеет тип Boolean. Указанное значение должно быть статическим. Аспект Parallel_Calls унаследованной примитивной подпрограммы равен True, если Parallel_Calls равен True либо для соответствующей подпрограммы типа-прогенитора, либо для любой другой унаследованной подпрограммы, которую она переопределяет. Если не указано или унаследовано как True, аспект Parallel_Calls подпрограммы равен False.
Указание аспекта Parallel_Calls как True для подпрограммы указывает, что подпрограмма может быть безопасно вызвана параллельно. Проверки конфликтов (если они необходимы в соответствии с политикой Conflict_Check_Policy) выполняются для подпрограммы с предположением, что существуют несколько одновременных вызовов. После этого такие проверки могут быть пропущены при вызове подпрограммы в контексте параллельной итерации.

Разрешения для реализации

При применении политики проверки конфликтов Known_Parallel_Conflict_Checks или All_Parallel_Conflict_Checks реализация может запретить два одновременных действия, появляющиеся в параллельных конструкциях, если реализация может доказать, что они во время выполнения будут обозначать один и тот же объект с конфликтующими использованиями. Аналогично, при применении политики проверки конфликтов Known_Tasking_Conflict_Checks или All_Tasking_Conflict_Checks реализация может запретить два одновременных действия, по крайней мере одно из которых появляется в теле задачи, но не в параллельной конструкции, если реализация может доказать, что они во время выполнения будут обозначать один и тот же объект с конфликтующими использованиями.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API