Обычными средствами передачи данных между задачами являются операторы вызова и принятия входов.
Если две задачи считывают или изменяют разделяемую переменную (доступную обеим задачам), то ни одна из них ничего не может знать о порядке выполнения операций над переменной в другой задаче, исключая точки их синхронизации. Две задачи синхронизуются в начале и в конце их рандеву. В начале и в конце своей активизации задача синхронизуется с вызвавшей эту активизацию задачей. Задача, которая закончила свое выполнение, синхрони-зуема с любой другой задачей.
О действиях, выполняемых программой, использующей разделяемые переменные, всегда могут быть сделаны следующие предположения:
• Если в интервале времени между двумя точками синхронизации задача считывает разделяемую переменную скалярного или ссылочного типа, то эта переменная не изменяется никакой другой задачей в течение данного интервала времени.
• Если в интервале времени между двумя точками синхронизации задача изменяет разделяемую переменную скалярного или ссылочного типа, то эта переменная не считывается и не изменяется никакой другой задачей в течение данного интервала времени.
Выполнение программы ошибочно, если какое-либо из этих предположений нарушено.
Если данная задача считывает значение разделяемой переменной, сделанные выше предположения допускают, чтобы реализация поддерживала локальные копии значения (например, в регистрах или в некоторых других видах временной памяти); и пока данная задача не достигла точки синхронизации или не изменила значение разделяемой переменной, следствием принятых допущений является то, что для данной задачи чтение локальной копии эквивалентно чтению собственно разделяемой переменной.
Аналогично если данная задача изменяет значение разделяемой переменной, сделанные предположения допускают, чтобы реализация поддерживала локальные копии значения и откладывала запоминание локальной копии в разделяемую переменную до точки синхронизации, заменяя каждые последующие считывание или изменения значений разделяемой переменной на считывание или изменение локальной копии. С Другой стороны, не допускается, чтобы реализация вводила такую память, которая не будет обрабатываться в каноническом порядке (см. 11.6).
Для задания того, что каждое считывание или изменение значения разделяемой переменной является для этой переменной точкой синхронизации, может быть использована прагма SHARED, т.е. для данной переменной (но не обязательно для остальных) сделанных выше предположения справедливы. Форма этой прагмы следующая:
pragma SHARED (простое-имя-переменной);
Прагма допустима только для переменной, объявленной описанием объекта скалярного или ссылочного типа; описание переменной и прагма должны помещаться (в таком порядке) непосредственно в одном и том же разделе описаний или в спецификации пакета; прагма должна появиться до любого вхождения имени переменной, отличного от вхождения в спецификаторе адреса.
Реализация должна ограничивать объекты, для которых допустима прагма SHARED, объектами, для которых каждое прямое считывание или прямое изменение реализуется неделимыми операциями.
Ссылки: активизация 9.3, глобальный 8.1, задача 9, изменение значение 6.2 канонический порядок 11.6, оператор вызова входа 9.5, оператор принятия 9.5, ошибочный 1.6, переменная 3.2.1, прагма 2.8, присваивание 5.2, простое имя 3.1, 4.1, раздел описаний 3.9, рандеву 9.5, спецификация пакета 7.1, тип 3.3, чтение значения 6.2.