Разделяемые (общие) переменные
Ада позволяет задачам совместно использовать разделяемые (общие) переменные (объекты, ресурсы), которые располагаются в общей памяти и могут быть необходимы как для организации взаимодействия задач, так и для хранения каких-либо общих данных.
Следовательно, необходимо, чтобы такие переменные допускали возможность чтения/записи из различных задач программы.
Поскольку при выполнении программы возможны ситуации, когда несколько задач пытаются получить доступ к одной и той же разделяемой переменной, во избежание конфликтных ситуаций и поддержки общей корректности работы программы необходима синхронизация доступа к разделяемым переменным.
Обеспечение синхронизации доступа к разделяемым переменным представляет собой основополагающую проблему многозадачного (параллельного) программирования, и называется взаимным исключением.
Решение этой проблемы основывается на том, что в какой-либо момент времени право на доступ к разделяемой переменной предоставляется только одной задаче.
Для обеспечения синхронизации доступа используются специальные программные (или аппаратные) средства: семафоры, критические секции, мониторы и т.д.
В стандарте Ada95 для указания разделяемых переменных используются следующие директивы компилятора:
pragma Atomic ( Local_Name ); pragma Atomic_Components ( Local_Array_Name );
pragma Volatile ( Local_Name ); pragma Volatile_Components ( Local_Array_Name ); |
Здесь Local_Name указывает локальное имя объекта или описание типа, а Local_Array_Name указывает локальное имя объекта-массива или описание типа-массива.
Директивы компилятора Atomic и Atomic_Components обеспечивают непрерывность операций чтения/записи для всех указанных в них объектах.
Такие объекты называют атомарными (atomic), а операции над ними выполняются только последовательно.
Директивы компилятора Volatile и Volatile_Components обеспечивают выполнение операций чтения/записи для всех указанных в них объектах непосредственно в памяти.
Примеры применения этих директив компилятора могут иметь следующий вид:
Array_Size : Positive; pragma Atomic (Array_Size); pragma Volatile (Array_Size);
Store_Array is array (1..Array_Size) of Integer; pragma Atomic_Components (Store_Array); pragma Volatile_Components (Store_Array); |
Разделяемые переменные и перечисленные для них директивы компилятора могут быть использованы для организации:
Следует заметить, что описанные подобным образом разделяемые переменные не должны использоваться для синхронизации взаимодействия задач, для этого следует использовать средства механизма рандеву и/или защищенные объекты.