Spec-Zone.ru › Ada 2005
Справочник Ada 2005

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;

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

После применения операции 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, если её не представляется возможным реализовать в целевой среде.
ПРИМЕЧАНИЯ
37 Следовательно из правил приоритета, что задержанные задачи не могут быть диспетчеризованы ни на одном процессоре в разделе (если они не наследуют приоритеты), поскольку их приоритеты определены как ниже приоритета любой задачи простоя.
38 Эффект вызова Get_Priority и Set_Priority для задержанной задачи такой же, как и для любой другой задачи.
39 Вызов Hold для задержанной задачи или Continue для незадержанной задачи не имеет эффекта.
40 Правила, влияющие на очередность, выводятся из вышеуказанных правил, а также из обычных правил приоритетов:
  • Когда задержанная задача находится в очереди готовности, её приоритет настолько низок, что она никогда не достигнет вершины очереди, пока в этой очереди есть другие задачи.
  • Если задача выполняется в защищенном действии, внутри rendez-vous или наследует приоритеты от других источников (например, при активации), она продолжает выполняться, пока не прекратит выполнение соответствующей конструкции.
  • Если задача становится задержанной, ожидая (как вызывающая сторона) завершения rendez-vous, активный приоритет принимающей задачи не изменяется.
  • Если задача становится задержанной, ожидая в selective_accept, и вызов входа поступает в один из открытых входов, соответствующий accept_alternative выполняется. Когда rendez-vous завершается, активный приоритет принимающей задачи понижается до задержанного приоритета (если она по-прежнему наследует приоритеты от других источников), и задача не выполняется до следующего Continue.
  • То же самое относится к случаю, когда задержанная задача является единственной задачей в очереди защищенного входа, барьер которого становится открытым. Соответствующее тело входа выполняется.


Spec-Zone.ru

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