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

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) выполнение каждой включенной в прерываемое выполнение конструкции также прерывается, за исключением выполняемых операций отложенного прерывания; выполнение операции отложенного прерывания продолжается до завершения без влияния прерывания; операциями отложенного прерывания являются:
  • защищенное действие;
  • ожидание завершения вызова входа (после начала попытки его отмены — см. ниже);
  • ожидание завершения зависимых задач;
  • выполнение процедуры 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.
ПРИМЕЧАНИЕ 1 Оператор abort_statement лучше использовать только в ситуациях, требующих безусловного завершения.
ПРИМЕЧАНИЕ 2 Задача может прервать любую задачу, которую она может назвать, включая саму себя.
ПРИМЕЧАНИЕ 3 Дополнительные требования, связанные с прерыванием, приведены в D.6.


Spec-Zone.ru

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