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

9.1 Задачи, блоки задач и объекты задач

Блок задачи объявляется с помощью объявления задачи, которое имеет соответствующий блок_задачи. Объявление задачи может быть объявлением_типа_задачи, в этом случае оно объявляет именованный тип задачи; или же это может быть объявление_единичной_задачи, в этом случае оно определяет безымянный тип задачи, а также объявляет именованный объект задачи этого типа.

Синтаксис

объявление_типа_задачи ::=
task type идентификатор_определения [известная_часть_дискриминантов]
[спецификация_аспекта] [is
[new список_интерфейсов with]
определение_задачи];
объявление_единичной_задачи ::=
task идентификатор_определения
[спецификация_аспекта] [is
[new список_интерфейсов with]
определение_задачи];
определение_задачи ::=
{элемент_задачи}
[ private
{элемент_задачи}]
end [идентификатор_задачи]
элемент_задачи ::= объявление_входной_точки | оператор_аспекта
блок_задачи ::=
task body идентификатор_определения
[спецификация_аспекта] is
часть_объявлений
begin
обработанная_последовательность_операторов
end [идентификатор_задачи];
Если идентификатор_задачи появляется в конце определения_задачи или блока_задачи, он должен повторять идентификатор_определения.
Абзац 8 был удалён.

Статические семантические правила

определение_задачи определяет тип задачи и его первый подтип. Первый список элементов_задачи в определении_задачи, а также известная_часть_дискриминантов, если таковая имеется, называется видимой частью блока задачи. Необязательный список элементов_задачи после ключевого слова private называется закрытой частью блока задачи.
Для объявления задачи без определения_задачи, предполагается определение_задачи без элементов_задачи.
Если в объявлении задачи присутствует список_интерфейсов, то тип задачи наследует пользовательские примитивные подпрограммы от каждого родительского типа (см. 3.9.4), аналогично тому, как производный тип наследует пользовательские примитивные подпрограммы от своих родительских типов (см. 3.4). Если первый параметр унаследованной примитивной подпрограммы имеет тип задачи или является параметром доступа, обозначающим тип задачи, и существует объявление_входной_точки для единственной точки входа с тем же идентификатором внутри объявления задачи, чья спецификация соответствует префиксной спецификации унаследованной подпрограммы, то унаследованная подпрограмма считается реализованной соответствующей точкой входа задачи с помощью неявно объявленной неабстрактной подпрограммы, имеющей ту же спецификацию, что и унаследованная подпрограмма и переопределяющей её.

Правила законности

Объявление задачи требует завершения, которое должно быть блоком_задачи, и каждый блок_задачи должен быть завершением какого-либо объявления задачи.
Каждый интерфейс_подтип в списке_интерфейсов в объявлении задачи должен обозначать ограниченный тип интерфейса, который не является защищённым интерфейсом.
Префиксная спецификация явно объявленной примитивной подпрограммы для помеченного типом задачи не должна соответствовать никакой точке входа типа задачи, если подпрограмма имеет то же имя, что и точка входа, и первый параметр подпрограммы имеет тип задачи или является параметром доступа, обозначающим тип задачи.
Для каждой примитивной подпрограммы, унаследованной типом, объявленным в объявлении задачи, должно выполняться не более одного из следующих условий:
  • унаследованная подпрограмма переопределяется примитивной подпрограммой типа задачи, в этом случае переопределяющая подпрограмма должна быть совместима по подтипу с унаследованной подпрограммой и не абстрактной; или
  • унаследованная подпрограмма реализуется единственной точкой входа типа задачи; в этом случае её префиксная спецификация должна соответствовать спецификации точки входа задачи.
Если ни одно из условий не выполняется, унаследованная подпрограмма должна быть пустой процедурой. Кроме мест, где обычно применяются правила законности (см. 12.3), эти правила также применяются в закрытой части экземпляра генерируемого блока.

Динамические семантические правила

Выполнение объявления задачи выполняет определение_задачи. Выполнение объявления_единичной_задачи также создаёт объект заданного (безымянного) типа задачи.
Выполнение определения_задачи создаёт тип задачи и его первый подтип; оно также включает выполнение объявлений_входных_точек в заданном порядке.
В рамках инициализации объекта задачи, все операторы_аспекта и любые ограничения для объекта, связанные с объявлениями_входных_точек соответствующего определения_задачи, выполняются в заданном порядке.
Выполнение блока_задачи не имеет иного эффекта, кроме как установить, что задачи типа могут с этого момента активироваться без сбой Проверки_Выполнения.
Исполнение блока_задачи вызывается активацией задачи соответствующего типа (см. 9.2).
Содержание объекта задачи заданного типа включает:
  • Значения дискриминантов объекта задачи, если таковые имеются;
  • Очередь входа для каждой точки входа объекта задачи;
  • Представление состояния связанной задачи.
ПРИМЕЧАНИЕ 1 Помимо определения_доступа, имя блока задачи в объявлении или теле блока обозначает текущий экземпляр блока (см. 8.6), а не первый подтип соответствующего типа задачи (и, следовательно, имя не может использоваться как подтип).
ПРИМЕЧАНИЕ 2 Использование обозначения выбранного_компонента позволяет указать дискриминант задачи (см. 4.1.3). Внутри блока задачи имя дискриминанта типа задачи обозначает соответствующий дискриминант текущего экземпляра блока.
ПРИМЕЧАНИЕ 3 Тип задачи является ограниченным типом (см. 7.5), и поэтому исключает использование assignment_statement и предопределенных операторов равенства. Если программист хочет написать приложение, которое хранит и обменивается идентификаторами задач, он может сделать это, определив тип доступа, обозначающий соответствующие объекты задач, и используя значения доступа для целей идентификации. Присваивание доступно для такого типа доступа, как и для любого типа доступа. В качестве альтернативы, если реализация поддерживает Приложение по программированию систем, атрибут Identity может использоваться для идентификации задач (см. C.7.1).

Примеры

Примеры объявлений типов задач:
task type Server is
entry Next_Work_Item(WI : in Work_Item);
entry Shut_Down;
end Server;
task type Keyboard_Driver(ID : Keyboard_ID := New_ID) is
new Serial_Device with -- см. 3.9.4
entry Read (C : out Character);
entry Write(C : in Character);
end Keyboard_Driver;
Примеры объявлений отдельных задач:
task Controller is
entry Request(Level)(D : Item); -- семейство записей
end Controller;
task Parser is
entry Next_Lexeme(L : in Lexical_Element);
entry Next_Action(A : out Parser_Action);
end;
task User; -- не имеет записей
Примеры объектов задач:
Agent : Server;
Teletype : Keyboard_Driver(TTY_ID);
Pool : array(1 .. 10) of Keyboard_Driver;
Пример типа доступа, обозначающего объекты задач:
type Keyboard is access Keyboard_Driver;
Terminal : Keyboard := new Keyboard_Driver(Term_ID);


Spec-Zone.ru

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