Справочник Ada 2005
9.2 Выполнение задач — Активация задач
Динамическая семантика
Выполнение задачи заданного типа задачи состоит из выполнения соответствующего task_body. Начальная часть этого выполнения называется активацией задачи; она состоит из проработки declarative_part task_body. Если во время проработки declarative_part будет распространено исключение, активация задачи считается неудачной, и задача становится завершённой.
Объект задачи (представляющий одну задачу) может быть частью автономного объекта, объекта, созданного с помощью аллокатора, или анонимного объекта ограниченного типа, или корасширения одного из них. Все задачи, являющиеся частью или корасширениями любого из автономных объектов, созданных при проработке object_declaration (или generic_association формальных объектов режима in) в одной области объявления, активируются вместе. Все задачи, являющиеся частью или корасширениями одного объекта, который не является автономным объектом, активируются вместе.
Для задач данной области объявления активации запускаются в контексте обработанной_последовательности_операторов (и её связанных обработчиков_исключений, если таковые имеются — см. 11.2), непосредственно перед выполнением операторов обработанной_последовательности_операторов. Для пакета без явного тела или явной обработанной_последовательности_операторов подразумевается неявное тело или неявный null_statement, как определено в 7.2.
Для задач, являющихся частью или корасширениями одного объекта, который не является автономным объектом, активации запускаются после завершения любой инициализации внешнего объекта, содержащего эти задачи, до выполнения любых других операций над внешним объектом. В частности, для задач, являющихся частью или корасширениями объекта, созданного оценкой аллокатора, активации запускаются как последний шаг оценки аллокатора до возвращения нового значения доступа. Для задач, являющихся частью или корасширениями объекта, являющегося результатом вызова функции, активации не запускаются до возвращения функции.
Задача, создавшая новые задачи и запустившая их активации (активатор), блокируется до завершения всех этих активаций (успешно или нет). После завершения всех этих активаций, если активация любой из задач завершилась неудачно (из-за распространения исключения), в активаторе поднимается исключение Tasking_Error в месте, где он запустил активации. В противном случае активатор продолжает выполнение обычно. Любые задачи, прерванные до завершения их активации, игнорируются при определении необходимости поднятия Tasking_Error.
Если задача, создавшая новые задачи, никогда не достигнет момента запуска активаций (из-за прерывания или поднятия исключения), вновь созданные задачи завершаются и никогда не активируются.
ПРИМЕЧАНИЯ
5 Вход задачи может быть вызван до активации задачи.
6 Если несколько задач активируются вместе, выполнение любой из этих задач не должно ожидать завершения активации других задач.
7 Задача может стать завершённой во время своей активации либо из-за исключения, либо из-за прерывания (см. 9.8).
Примеры
Пример активации задачи:
procedure P is
A, B : Server; -- обработать объекты задачи A, B
C : Server; -- обработать объект задачи C
begin
-- задачи A, B, C активируются вместе перед первым оператором
...
end;
A, B : Server; -- обработать объекты задачи A, B
C : Server; -- обработать объект задачи C
begin
-- задачи A, B, C активируются вместе перед первым оператором
...
end;