Языки программирования. Практический сравнительный анализ


Языки программирования. Практический сравнительный анализ - стр. 225


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

Программа именно этой задачи и определяет дисциплину доступа к разделяемому ресурсу.

Концепция внутренней дисциплины лучше соответствует концепции абстракции данных (в данном случае, концепции разделяемого ресурса) - ведь все особенности данного сосредоточены в мониторе, а не "размазаны" по внешним задачам.

Аппарат паралельного программирования в Аде ориентирован именно на концепцию внутренней дисциплины управления доступом к разделяемым ресурсам.

Поэтому в нашем примере естественно организовать очередь разборов в виде монитора Хоара, реализованного в виде обслуживающей задачи.

Оформим все три задачи - А, С и "очередь" в одном пакете. Однако так как "очередь" - обслуживающая, вспомогательная задача, мы скроем ее от пользователя пакета, поместив ее объявление в тело пакета.

            package анализ_синтез is

                        type сообщение is array (1..200) of CHARACTER;

                        type ответ is new сообщение;

                        task A is

                              entry прими (Х: in сообщение);

                        end A;

                        task C is

                              entry выдай (X: out ответ);

                        end C;

                  end анализ_синтез;

Как уже говорилось, каждый вход (entry) с точки зрения использования не отличается от процедуры. Так что вход "прими" в задаче А служит для приема сообщений извне (к нему обращаются из контекста, использующего пакет анализ_синтез). Соответственно вход "выдай" в задаче С служит для выдачи ответов. Задачу "очередь" нельзя объявить в спецификации пакета. Она должна быть инкапсулирована, чтобы обеспечить целостность ресурса­посредника между задачами А и С.

            package body анализ_синтез is

     type разбор is new сообщение;

                  task буфер is -- это вместо "очереди".




- Начало -  - Назад -  - Вперед -