Справочник по Аде (Ada 2022)
D.11 Управление асинхронными задачами
Этот подраздел представляет пакет, определённый языком, для асинхронной приостановки/возобновления задач. Он использует концептуальное значение приоритета ожидания для представления состояния задачи ожидания.
Статическая семантика
Существует следующий пакет библиотеки, определённый языком:
with Ada.Task_Identification;
package Ada.Asynchronous_Task_Control
with Preelaborate, Nonblocking, Global => in out synchronized is
procedure Hold(T : in Ada.Task_Identification.Task_Id);
procedure Continue(T : in Ada.Task_Identification.Task_Id);
function Is_Held(T : Ada.Task_Identification.Task_Id)
return Boolean;
end Ada.Asynchronous_Task_Control;
package Ada.Asynchronous_Task_Control
with Preelaborate, Nonblocking, Global => in out synchronized is
procedure Hold(T : in Ada.Task_Identification.Task_Id);
procedure Continue(T : in Ada.Task_Identification.Task_Id);
function Is_Held(T : Ada.Task_Identification.Task_Id)
return Boolean;
end Ada.Asynchronous_Task_Control;
Динамическая семантика
После применения операции Hold к задаче, задача переходит в состояние ожидания. Для каждого процессора существует концептуальная задача ожидания, которая всегда готова. Базовый приоритет задачи ожидания ниже System.Any_Priority'First. Приоритет ожидания — это константа типа Integer, значение которой ниже базового приоритета задачи ожидания.
Для любого приоритета ниже System.Any_Priority'First политика диспетчеризации задач — FIFO_Within_Priorities.
Операция Hold устанавливает состояние T в ожидание. Для задачи в состоянии ожидания активный приоритет переоценивается так, как будто базовый приоритет задачи — это приоритет ожидания.
Операция Continue сбрасывает состояние T в не-ожидание; её активный приоритет затем переоценивается в соответствии с политикой диспетчеризации задач, связанной с её базовым приоритетом.
Функция Is_Held возвращает True тогда и только тогда, когда T находится в состоянии ожидания.
В рамках этих операций выполняется проверка, что задача, идентифицированная T, не завершена. Tasking_Error поднимается, если проверка завершается неудачно. Program_Error поднимается, если значение T равно Null_Task_Id.
Ошибочное выполнение
Если любая операция в этом пакете вызывается с параметром T, указывающим объект задачи, который больше не существует, выполнение программы является ошибочным.
Разрешения на реализацию
Реализация может опустить поддержку Asynchronous_Task_Control, если её невозможно поддержать в целевой среде.
ПРИМЕЧАНИЕ 1 Из правил приоритетов следует, что задачи в состоянии ожидания не могут быть диспетчеризованы ни на одном процессоре в разделе (если они не наследуют приоритеты), так как их приоритеты определены ниже приоритета любой задачи ожидания.
ПРИМЕЧАНИЕ 2 Эффект вызова Get_Priority и Set_Priority для задачи в состоянии ожидания такой же, как и для любой другой задачи.
ПРИМЕЧАНИЕ 3 Вызов Hold для задачи в состоянии ожидания или Continue для задачи в не-ожидании не оказывает никакого влияния.
ПРИМЕЧАНИЕ 4 Правила, влияющие на очереди, выводятся из вышеупомянутых правил, а также из обычных правил приоритетов:
Когда задача в состоянии ожидания находится в очереди готовности, её приоритет настолько низок, что она никогда не достигнет начала очереди, пока в этой очереди есть другие задачи.
Если задача выполняется в защищённом действии, внутри rendez-vous или наследует приоритеты от других источников (например, при активации), она продолжает выполняться до тех пор, пока больше не выполняет соответствующую конструкцию.
Если задача переходит в состояние ожидания, ожидая (как вызывающий) завершения rendez-vous, активный приоритет принимающей задачи не изменяется.
Если задача переходит в состояние ожидания, ожидая в selective_accept, и вызывается входной вызов одного из открытых входов, выполняется соответствующая accept_alternative. Когда rendez-vous завершается, активный приоритет принимающей задачи понижается до приоритета ожидания (если она все еще наследует приоритеты из других источников), и задача не выполняется до следующего Continue.
То же самое происходит, если задача в состоянии ожидания — единственная задача в очереди защищённого входа, барьер которого становится открытым. Соответствующее тело входа выполняется.