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

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

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

Синтаксис

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

Правила правомерности

Объявление задачи требует завершения, которое должно быть телом_задачи, и каждое тело_задачи должно быть завершением некоторого объявления задачи.

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

определение_задачи определяет тип задачи и его первый подтип. Первый список элементов_задачи в определении_задачи, вместе с известной_частью_дискриминантов, если таковая имеется, называется видимой частью единицы задачи. Необязательный список элементов_задачи после ключевого слова private называется закрытой частью единицы задачи.
Для объявления задачи без определения_задачи предполагается определение_задачи без элементов_задачи.

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

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

Примеры

Примеры объявлений типов задач:
task type Сервер is
entry Следующая_Задача(WI : in Работа_Элемент);
entry Закрытие;
end Сервер;
task type Драйвер_Клавиатуры(ID : Идентификатор_Клавиатуры := Новый_Идентификатор) is
entry Читать (C : out Символ);
entry Записать(C : in Символ);
end Драйвер_Клавиатуры;
Примеры объявлений отдельных задач:
task Контроллер is
entry Запрос(Уровень)(D : Элемент); -- множество входных точек
end Контроллер;
task Парсер is
entry Следующий_Лексема(L : in Лексема);
entry Следующее_Действие(A : out Действие_Парсера);
end;
task Пользователь; -- не имеет входных точек
Примеры объектов задач:
Агент : Сервер;
Телетайп : Драйвер_Клавиатуры(TTY_ID);
Пул : array(1 .. 10) of Драйвер_Клавиатуры;
Пример типа доступа, обозначающего объекты задач:
type Клавиатура is access Драйвер_Клавиатуры;
Терминал : Клавиатура := new Драйвер_Клавиатуры(Term_ID);


Spec-Zone.ru

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