Справочник по Ada (Ada 2022)
9.8 Прерывание задачи — Прерывание последовательности операторов
Оператор abort_statement приводит к тому, что одна или несколько задач становятся аномальными, тем самым предотвращая дальнейшее взаимодействие с такими задачами. Завершение оператора triggering_statement асинхронного выбора asynchronous_select приводит к прерыванию последовательности операторов sequence_of_statements.
Синтаксис
Правила разрешения имен
Каждое имя 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.