Справочник по Ada 2012
D.11 Управление асинхронными задачами
Этот подпункт вводит определённый языком пакет для асинхронной приостановки/возобновления задач. Он использует концептуальное значение приоритета удержания для представления состояния задачи удержания.
Статическая семантика
Существует следующий определённый языком библиотечный пакет:
with Ada.Task_Identification;
package Ada.Asynchronous_Task_Control is
pragma Preelaborate(Asynchronous_Task_Control);
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 is
pragma Preelaborate(Asynchronous_Task_Control);
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, если её невозможно поддержать в целевой среде.
ПРИМЕЧАНИЯ
38 Следствием правил приоритетов является то, что удерживаемые задачи не могут быть диспетчеризованы ни на одном процессоре в разделе (если они не наследуют приоритеты), так как их приоритеты определены как ниже приоритета любой неактивной задачи.
39 Действие вызовов Get_Priority и Set_Priority для удержанной задачи такое же, как и для любой другой задачи.
40 Вызов Hold для удержанной задачи или Continue для неудержанной задачи не имеет никакого эффекта.
41 Правила, влияющие на очереди, выводятся из вышеупомянутых правил, помимо обычных правил приоритетов:
Когда удерживаемая задача находится в очереди готовности, её приоритет настолько низок, что она никогда не достигнет вершины очереди, пока в этой очереди есть другие задачи.
Если задача выполняется в защищённом действии, внутри связи или наследует приоритеты от других источников (например, при активации), она продолжает выполняться, пока она больше не выполняет соответствующий конструкт.
Если задача становится удержанной, ожидая (как вызывающая) завершения связи, активный приоритет принимающей задачи не изменяется.
Если задача становится удержанной, ожидая в selective_accept, и вызывается вызов входа в один из открытых входов, соответствующий accept_alternative выполняется. Когда связь завершается, активный приоритет принимающей задачи понижается до приоритета удержания (если он всё ещё наследуется от других источников), и задача не выполняется, пока не будет следующего Continue.
То же самое верно, если удерживаемая задача является единственной задачей в очереди защищённого входа, барьер которого открывается. Соответствующее тело входа выполняется.