Справочник Ada 95
9.3 Зависимость задач — завершение задач
Динамическая семантика
Каждая задача (кроме задачи окружения — см. 10.2) зависит от одной или нескольких задач-мастеров (см. 7.6.1), следующим образом:
- Если задача создаётся при вычислении аллокатора для заданного типа доступа, она зависит от каждой задачи-мастера, включающей в себя разработку объявления конечного предка заданного типа доступа.
- Если задача создаётся при разработке объявления_объекта, она зависит от каждой задачи-мастера, включающей в себя эту разработку.
Кроме того, если задача зависит от заданной задачи-мастера, она определяется как зависящая от задачи, выполняющей задачу-мастера, и (рекурсивно) от любой задачи-мастера этой задачи.
Задача считается завершенной, когда выполнение соответствующего тела_задачи завершено. Задача считается законченной, когда выполнена любая финализация тела_задачи (см. 7.6.1). Первый шаг финализации задачи-мастера (включая тело_задачи) заключается в ожидании завершения всех задач, зависящих от этой задачи-мастера. Задача, выполняющая задачу-мастера, блокируется до завершения всех зависимых задач. Затем выполняется любая оставшаяся финализация, и задача-мастер завершается.
Завершение задачи (и соответствующего тела_задачи) может произойти, когда задача заблокирована в выражении_выбора с открытой альтернативой_прерывания (см. 9.7.1); открытая альтернатива_прерывания выбирается только в том случае, если выполнены следующие условия:
- Задача зависит от завершённой задачи-мастера;
- Каждая задача, зависящая от рассматриваемой задачи-мастера, либо уже завершена, либо аналогично заблокирована в выражении_выбора с открытой альтернативой_прерывания.
Когда оба условия выполнены, рассматриваемая задача завершается вместе со всеми задачами, зависящими от рассматриваемой задачи-мастера, которые ещё не завершены.
ПРИМЕЧАНИЯ
8 Полный вид ограниченного частного типа может быть типом задачи или может иметь подкомпоненты типа задачи. Создание объекта такого типа создаёт зависимости в соответствии с полным типом.
9 объявление_переименования_объекта определяет новый вид существующего сущности и, следовательно, не создаёт дополнительных зависимостей.
10 Правила, заданные для коллективного завершения группы задач, все заблокированные в выражениях_выбора с открытыми альтернативами_прерывания, гарантируют, что коллективное завершение может произойти только тогда, когда не осталось активных задач, которые могли бы вызвать одну из задач, которые коллективно завершаются.
11 Если две или более задачи заблокированы в выражениях_выбора с открытыми альтернативами_прерывания и коллективно завершаются, их действия финализации выполняются параллельно.
12 Завершение задачи может произойти по следующим причинам:
- возникновение исключения во время разработки декларативной_части соответствующего тела_задачи;
- завершение обрабатываемой_последовательности_выражений соответствующего тела_задачи;
- выбор открытой альтернативы_прерывания выражения_выбора в соответствующем теле_задачи;
- прерывание задачи.
Примеры
Пример зависимости задач:
declare
type Global is access Server; -- см. 9.1
A, B : Server;
G : Global;
begin
-- активация A и B
declare
type Local is access Server;
X : Global := new Server; -- активация X.all
L : Local := new Server; -- активация L.all
C : Server;
begin
-- активация C
G := X; -- G и X обозначают один и тот же объект задачи
...
end; -- ожидание завершения C и L.all (но не X.all)
...
end; -- ожидание завершения A, B и G.all
type Global is access Server; -- см. 9.1
A, B : Server;
G : Global;
begin
-- активация A и B
declare
type Local is access Server;
X : Global := new Server; -- активация X.all
L : Local := new Server; -- активация L.all
C : Server;
begin
-- активация C
G := X; -- G и X обозначают один и тот же объект задачи
...
end; -- ожидание завершения C и L.all (но не X.all)
...
end; -- ожидание завершения A, B и G.all