Справочник по Ada 95
D.11 Управление асинхронными задачами
Данный пункт описывает пакет, определенный языком, для асинхронной приостановки/возобновления задач. Он использует концептуальное значение приоритета удержания для представления состояния задачи удержанной.
Статическая семантика
Существует следующий пакет библиотеки, определённый языком:
with Ada.Task_Identification;
package Ada.Asynchronous_Task_Control 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 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, значение которой ниже базового приоритета задачи ожидания.
Операция Hold устанавливает состояние T в удержанное. Для удержанной задачи: собственный базовый приоритет задачи не является источником наследования (см. D.1), а вместо этого значение приоритета удержания определяется как такой источник.
Операция Continue сбрасывает состояние T в неудержанное; активный приоритет T затем переоценивается, как описано в D.1. На этот раз учитывается базовый приоритет T.
Функция Is_Held возвращает True тогда и только тогда, когда T находится в состоянии удержания.
В рамках этих операций выполняется проверка, что задача, идентифицированная T, не завершена. Tasking_Error поднимается, если проверка завершается неудачно. Program_Error поднимается, если значение T равно Null_Task_ID.
Ошибочное выполнение
Если любая операция в этом пакете вызывается с параметром T, указывающим объект задачи, который больше не существует, выполнение программы является ошибочным.
Разрешения реализации
Реализация не обязана поддерживать Asynchronous_Task_Control, если её не представляется возможным поддержать в целевой среде.
ПРИМЕЧАНИЯ
33 Из правил приоритетов следует, что удержанные задачи не могут быть расписаны ни на одном процессоре в разделе (если они не наследуют приоритеты), поскольку их приоритеты определены ниже приоритета любой задачи ожидания.
34 Действие вызовов Get_Priority и Set_Priority для задачи в состоянии удержания такое же, как и для любой другой задачи.
35 Вызов Hold для удержанной задачи или Continue для неудержанной задачи не оказывает никакого эффекта.
36 Правила, влияющие на очереди, выводятся из вышеуказанных правил, в дополнение к обычным правилам приоритетов:
- Когда удержанная задача находится в очереди готовности, её приоритет настолько низок, что она никогда не достигнет вершины очереди, пока в этой очереди находятся другие задачи.
- Если задача выполняется в защищённом действии, внутри соглашения о rendez-vous или наследует приоритеты от других источников (например, при активации), она продолжает выполняться, пока больше не выполняет соответствующую конструкцию.
- Если задача становится удержанной, ожидая (как вызывающая сторона) завершения соглашения о rendez-vous, активный приоритет принимающей задачи не изменяется.
- Если задача становится удержанной, ожидая в selective_accept, и вызов входа делается одному из открытых входов, соответствующий accept_alternative выполняется. Когда соглашение о rendez-vous завершается, активный приоритет принимающей задачи понижается до приоритета удержания (если она ещё не наследует приоритет от других источников), и задача не выполняется до следующего Continue.
- То же самое происходит, если удержанная задача является единственной задачей в очереди защищённого входа, барьер которого становится открытым. Соответствующий тело входа выполняется.