Справочное руководство Ada 95
D.10 Синхронизация задач
Этот раздел описывает определяемый языком частный семафор (объект приостановки), который может использоваться для операций приостановки в две стадии и как простой строительный блок для реализации очередей более высокого уровня.
Статическая семантика
Существует следующий определяемый языком пакет:
package Ada.Synchronous_Task_Control is
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;
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 является типом по ссылке.
Динамическая семантика
Объект типа 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).
Требования к реализации
Реализация должна позволять вызывать Set_False и Set_True во время любой защищённой операции, даже такой, у которой приоритет потолка находится в диапазоне Interrupt_Priority.