Справочник по Ada 95
9.8 Прерывание задачи - Прерывание последовательности операторов
Оператор abort_statement приводит одну или несколько задач в ненормальное состояние, тем самым предотвращая дальнейшее взаимодействие с такими задачами. Завершение triggering_statement асинхронного asynchronous_select приводит к прерыванию sequence_of_statements.
Синтаксис
abort_statement ::= abort имя_задачиname {, имя_задачиname};
Правила разрешения имен
Каждое имя_задачиname должно соответствовать типу любой задачи; они не обязаны быть всех одного типа задачи.
Динамическая семантика
Для выполнения оператора abort_statement указанные имя_задачиname оцениваются в произвольном порядке. Затем каждая задача, указанная именем, прерывается, что заключается в приведении задачи к ненормальному состоянию и прерывании выполнения соответствующего task_body, если она еще не завершена.
При прерывании выполнения конструкции (включая task_body или sequence_of_statements) прерывается выполнение каждой включённой в прерываемое выполнение конструкции, за исключением выполнений, включённых в выполнение операции отложенного прерывания; выполнение операции отложенного прерывания продолжается до завершения без влияния прерывания; к операциям отложенного прерывания относятся:
- действие защищенного блока;
- ожидание завершения вызова входа (после инициирования попытки отмены — см. ниже);
- ожидание завершения зависимых задач;
- выполнение процедуры Initialize как последнего этапа стандартной инициализации управляемого объекта;
- выполнение процедуры Finalize как части завершения управляемого объекта;
- операция присваивания объекту с управляемой частью.
Последние три из них обсуждаются подробнее в 7.6.
При прерывании главного элемента все задачи, зависящие от этого главного элемента, прерываются.
Порядок, в котором задачи переходят в ненормальное состояние в результате оператора abort_statement или прерывания sequence_of_statements, не определён языком.
Если выполнение вызова входа прерывается, производится немедленная попытка отмены вызова входа (см. 9.5.3). Если выполнение конструкции прерывается в момент блокировки, кроме вызова входа, в точке, которая находится вне выполнения операции отложенного прерывания, то выполнение конструкции завершается немедленно. При прерывании из-за abort_statement эти немедленные эффекты происходят до завершения выполнения abort_statement. За исключением этих немедленных случаев, выполнение прерываемой конструкции не обязательно завершается до завершения оператора abort_statement. Однако выполнение прерываемой конструкции завершается не позже следующей точки завершения прерывания (если таковая имеется), которая происходит вне операции отложенного прерывания; следующие являются точками завершения прерывания для выполнения:
- точка, в которой выполнение инициирует активацию другой задачи;
- конец активации задачи;
- начало или конец выполнения вызова входа, accept_statement, delay_statement или abort_statement;
- начало выполнения select_statement или sequence_of_statements обработчика исключений.
Ограниченные (временные) ошибки
Попытка выполнить asynchronous_select в рамках выполнения операции отложенного прерывания является ограниченной ошибкой. Аналогично, попытка создать задачу, зависящую от главного элемента, который полностью находится в рамках выполнения операции отложенного прерывания, является ограниченной ошибкой. В обоих случаях, если реализация обнаруживает ошибку, то генерируется ошибка Program_Error; в противном случае операции выполняются так же, как и вне операции отложенного прерывания, за исключением того, что прерывание abortable_part или созданной задачи может или не может иметь эффект.
Ошибка выполнения
Если операция присваивания завершается преждевременно из-за прерывания, то присваивание считается прерванным; целевой объект присваивания или его части могут перейти в ненормальное состояние, и некоторые последующие использования объекта могут быть ошибочными, как объяснено в 13.9.1.
ПРИМЕЧАНИЯ
38 Оператор abort_statement следует использовать только в ситуациях, требующих безусловного завершения.
39 Задача может прервать любую задачу, которую она может назвать, включая себя.
40 Дополнительные требования, связанные с прерыванием, приведены в D.6, «Преемственное прерывание».