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