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