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

D.10 Синхронизация задач

В этом подразделе описывается определяемый языком приватный семафор (объект приостановки), который можно использовать для операций приостановки в два этапа и как простой строительный блок для реализации очередей более высокого уровня.

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

Существует определяемый языком пакет:
package Ada.Synchronous_Task_Control is
pragma Preelaborate(Synchronous_Task_Control);
type Suspension_Object is limited private;
procedure Set_True(S : in out Suspension_Object);
procedure Set_False(S : in out Suspension_Object);
function Current_State(S : Suspension_Object) return Boolean;
procedure Suspend_Until_True(S : in out Suspension_Object);
private
... -- не определено языком
end Ada.Synchronous_Task_Control;
Тип Suspension_Object является типом по ссылке.
Существует определяемый языком пакет:
package Ada.Synchronous_Task_Control.EDF is
procedure Suspend_Until_True_And_Set_Deadline
(S : in out Suspension_Object;
TS : in Ada.Real_Time.Time_Span);
end Ada.Synchronous_Task_Control.EDF;

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

Объект типа Suspension_Object имеет два видимых состояния: True и False. При инициализации его значение устанавливается в False.
Операции Set_True и Set_False являются атомными по отношению друг к другу и по отношению к Suspend_Until_True; они устанавливают состояние соответственно в True и False.
Current_State возвращает текущее состояние объекта.
Процедура Suspend_Until_True блокирует вызывающую задачу до тех пор, пока состояние объекта S не станет True; в этот момент задача становится готовой, а состояние объекта становится False.
Ошибка программы (Program_Error) возникает при вызове Suspend_Until_True, если другая задача уже ожидает на этом объекте приостановки. Suspend_Until_True — это потенциально блокирующая операция (см. 9.5.1).
Процедура Suspend_Until_True_And_Set_Deadline блокирует вызывающую задачу до тех пор, пока состояние объекта S не станет True; в этот момент задача становится готовой со сроком выполнения Ada.Real_Time.Clock + TS, а состояние объекта становится False. Ошибка программы (Program_Error) возникает при вызове Suspend_Until_True_And_Set_Deadline, если другая задача уже ожидает на этом объекте приостановки. Suspend_Until_True_And_Set_Deadline — это потенциально блокирующая операция.

Требования к реализации

Реализация должна допускать вызов Set_False и Set_True во время любой защищенной операции, даже той, у которой приоритет потолка находится в диапазоне Interrupt_Priority.
ПРИМЕЧАНИЯ
37 Более сложные схемы, такие как установка срока выполнения относительно момента вызова Set_True, могут быть запрограммированы с использованием защищенного объекта.


Spec-Zone.ru

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