Справочник по Ada 2012
9.8 Прерывание задачи — Прерывание последовательности операторов
Оператор abort_statement приводит к тому, что одна или несколько задач становятся аномальными, тем самым предотвращая дальнейшее взаимодействие с такими задачами. Завершение оператора triggering_statement асинхронного выбора asynchronous_select приводит к прерыванию последовательности операторов sequence_of_statements.
Синтаксис
Правила разрешения имен
Каждый task_name должен относиться к любому типу задачи; типы задач могут отличаться.
Динамические семантика
При выполнении оператора abort_statement заданные task_names оцениваются в произвольном порядке. Затем каждая указанная задача прерывается, что заключается в том, чтобы сделать задачу аномальной и прервать выполнение соответствующего тела задачи 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 обработчика исключений exception_handler.
Ограниченные ошибки во время выполнения
Попытка выполнить асинхронный выбор asynchronous_select как часть выполнения операции с отложенным прерыванием — ошибка. Аналогично, попытка создать задачу, зависящую от мастера, полностью включённого в выполнение операции с отложенным прерыванием, является ошибкой. В обоих случаях, если реализация обнаружит ошибку, то генерируется исключение Program_Error; в противном случае операции продолжаются так же, как и вне операции с отложенным прерыванием, за исключением того, что прерывание части abortable_part или созданной задачи может или не может иметь эффект.
Ошибочное выполнение
Если операция присваивания завершается преждевременно из-за прерывания, то присваивание считается прерванным; целевой объект присваивания или его части могут стать аномальными, и определённые последующие использования объекта могут быть ошибочными, как описано в разделе 13.9.1.
ПРИМЕЧАНИЯ
42 Оператор abort_statement следует использовать только в ситуациях, требующих безусловного прекращения.
43 Задача может прервать любую задачу, которую она может назвать, включая себя.
44 Дополнительные требования, связанные с прерыванием, приведены в разделе D.6, «Прерывание с приоритетом».