Каждая задача зависит по крайней мере от одного родителя. Родитель — это конструкция, являющаяся либо задачей, либо в данный момент выполняемым оператором блока или подпрограммой, либо библиотечным пакетом (но не описанным в другом программном модуле). Зависимость от родителя является непосредственной зависимостью в следующих двух случаях:
а) Задача, указанная задачным объектом, который является объектом или подкомпонен-той объекта, созданными при выполнении генератора, зависит от родителя, предвыполняюще-го соответствующее описание ссылочного типа.
б) Задача, указанная другим задачным объектом, зависит от родителя, выполнение которого создает задачный объект.
Более того, если задача зависит от данного родителя, являющегося оператором блока, выполняемым другим родителем, то задача также косвенно зависит и от этого родителя; тоже справедливо, если данный родитель является подпрограммой, вызванной другим родителем, а также если данный родитель — задача (прямо или косвенно), зависящая от другого родителя. Зависимости существуют и для объектов личного типа, полное описание которого задано в терминах задачного типа.
Говорят, что задача закончила свое выполнение, когда осуществилось выполнение последовательности операторов, помещенных в ее теле за зарезервированным словом begin. Аналогично говорят, что блок или подпрограмма закончили свое выполнение, когда осуществилось выполнение соответствующей последовательности операторов. В случае оператора блока также говорят, что выполнение его закончилось при достижении операторов выхода, возврата или перехода, передающих управление из блока. В случае процедуры также говорят, что ее выполнение закончилось при достижении соответствующего оператора возврата. В случае функции также говорят, что ее выполнение закончилось после вычисления результирующего выражения в операторе возврата. Наконец, выполнение задачи, оператора блока или подпрограммы закончено, если при выполнении содержащихся в них соответствующих последовательностей операторов возбуждено исключение и нет соответствующего ему обработчика, а при его наличии — по окончании выполнения соответствующего обработчика.
Если у задачи нет зависимых задач и закончено ее выполнение, имеет место ее завершение. После завершения задачи говорят, что она завершена. Если задача имеет зависимые задачи, то ее завершение имеет место после окончания выполнения задачи и завершения всех зависимых задач. Из оператора блока или тела подпрограммы, чье выполнение закончено, нельзя выйти до завершения всех зависимых задач.
С другой стороны, завершение задачи имеет место тогда и только тогда, когда ее выполнение достигло открытой альтернативы завершения в операторе отбора (см. 9.7.1) и удовлетворены следующие условия:
• Задача зависит от некоторого родителя, выполнение которого закончено (следовательно, не от библиотечного пакета).
• Каждая задача, зависящая от рассмотренного родителя, либо уже завершена, либо также ожидает открытой альтернативы завершения в операторе отбора.
Когда оба условия удовлетворены, задача становится завершенной вместе со всеми задачами, зависящими от этого же родителя.
Пример;
declare type GLOBAL is access RESOURCE; --CM 91 А, В : RESOURCE; G : GLOBAL;begin -— активизация А и В declare type LOCAL is access RESOURCE; X : GLOBAL := new RESOURCE; -— активизация X.all L : LOCAL := new RESOURCE; — активизация L.all С : RESOURCE; begin -— активизация С G := X; -- G и X указывают один и тот же задачный объект end: -— ожидание завершения С и L.all, но не X.allend; -- ожидание завершения А, В и G.all
Примечание. Правила завершения подразумевают, что все задачи, зависящие (прямо или косвенно) от заданного родителя и еще не завершенные, могут завершиться (коллективно) тогда и только тогда, когда каждая из них ожидает открытой альтернативы завершения в операторе отбора и выполнение данного родителя закончено.
Те же правила справедливы и для главной программы. Следовательно, для завершения главной программы необходимо завершение всех зависимых задач, даже если соответствующий задачный тип описан в библиотечном пакете. С другой стороны, завершение главной программы не зависит от завершения задач, в свою очередь зависящих от библиотечных пакетов;в языке не определено, требуется ли завершение таких задач.
Для ссылочного типа, являющегося производным другого ссылочного типа, соответствующее определение ссылочного типа является определением родительского типа; зависимость в данном случае является зависимостью от родителя, который предвыполняет основные определения родительского ссылочного типа.
Описание переименования вводит новое имя для уже существующего понятия и, следовательно, не порождает дальнейшей зависимости.
Ссылки: альтернатива завершения 9.7.1, библиотечный модуль 10.1, вызов подпрограммы 6.4, генератор 4.8, главная программа 10.1, задачный объект 9.2, исключение 11, обработчик исключения 11.2, объект 3.2, оператор 5, оператор блока 5.6, оператор возврата 5.8, оператор выхода 5.7, оператор перехода 5.9, описание 3.1, описание переименования 8.5, отбор с ожиданием 9.7.1, открытая альтернатива 9.7.1, пакет 7, подкомпонента 3.3, последовательность операторов 5.1, программный модуль 6, ссылочный тип 3.8, тело задачи 9.1, тело подпрограммы 6.3, указывать 9.1, функция 6.5.