Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

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 становится завершённой и никогда не активируется. Кроме того, если оператор возврата оставлен таким образом, что возвращаемый объект не возвращается вызывающей стороне, любая задача, созданная как часть возвращаемого объекта или одного из его корасширений, немедленно становится завершённой и никогда не активируется.
ПРИМЕЧАНИЕ 1 Вход в задачу может быть вызван до активации задачи.
ПРИМЕЧАНИЕ 2 Если несколько задач активируются вместе, выполнение любой из этих задач может продолжаться без ожидания окончания активации других задач.
ПРИМЕЧАНИЕ 3 Задача может стать завершённой во время своей активации либо из-за исключения, либо из-за прерывания (см. 9.8).

Примеры

Пример активации задачи:
процедура P является
A, B : Сервер; -- обработать объекты задач A, B
C : Сервер; -- обработать объект задачи C
начать
-- задачи A, B, C активируются вместе перед первым оператором
...
конец;


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API