Spec-Zone.ru › Ada 95
Справочник по 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;

Динамическая семантика

После применения операции 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.
  • То же самое происходит, если удержанная задача является единственной задачей в очереди защищённого входа, барьер которого становится открытым. Соответствующий тело входа выполняется.


Spec-Zone.ru

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