Spec-Zone.ru › Ada 2005
Справочник Ada 2005

9.8 Прерывание задачи — Прерывание последовательности операторов

Оператор abort_statement приводит одну или несколько задач в ненормальное состояние, тем самым предотвращая дальнейшее взаимодействие с такими задачами. Завершение triggering_statement асинхронного выбора asynchronous_select приводит к прерыванию sequence_of_statements.

Синтаксис

abort_statement ::= abort task_name {, task_name};

Правила разрешения имен

Каждое 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, «Прерывание с приоритетом».


Spec-Zone.ru

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