Раздел 13.4 - Защищенные типы. Часть 2

Теперь когда мы знаем о различных видах защищенных операций, имеет смысл научиться описывать защищенные типы.

Следующий пример - это семафор, реализованный при помощи защищенных типов. Можно сделать запрос на установку семафора "Seize". После того как семафор установлен, никакая другая задача не может вызвать операцию Seize, до тех пор пока он не будет сброшен.

  protected type Resource is
    entry Seize;        -- Запрос на эксклюзивное использование ресурса.
    procedure Release;  -- Освобождение ресурса.
  private
    Busy : Boolean := False;
  end Resource;
 
  protected body Resource is
    entry Seize when not Busy is
    begin
      Busy := True;
    end Seize;
 
    procedure Release is
    begin
      Busy := False;
    end Release;
  end Resource;

Ниже приведен пример создания защищенной переменной, которая является экземпляром защищенного типа Resource.

  Control : Resource;

А вот пример ее использования:

  Control.Seize;
  Diddle;
  Control.Release;

Ниже приведена BNF описания защищенного модуля (типа) и его тела.

  защищенное_описание ::= "protected" [ "type" ] идентификатор "is"
                            { описание_защищенной_операции }
                            [ "private" { описание_защищенного_элемента } ]
                            "end" [ идентификатор ]
  описание_защищенной_операции ::= описание_подпрограммы |
                                          описание_входа
  описание_защищенного_элемента ::= описание_защищенной_операции |
                                    описание_компонента
  
  защищенное_тело ::= "protected" "body" идентификатор "is"
                     { элемент_защищенной_операции }
                     "end" [ идентификатор ] ";"

Мы продемонстрировали, как можно реализоать семафор при помощи защищенных типов, поскольку семафоры - это широко распространенный механизм, использующийся при параллельном программировании. Впрочем, лучше всего использовать непосредственно защищенные типы, вместо того чтобы пытаться самому создавать механизмы межзадачного взаимодействия, использующие семафоры в качестве конструктивного элемента. Одна из причин, по которой семафоры тяжело использовать при реализации сложного межзадачного взаимодействия, состоит в том, что, если семафоров становится много, может оказаться трудно добиться корректности взаимодействия во всех возможных случаях, (чтобы на самом деле добиться корректности такого рода взаимодействий, может потребоваться разработка формального доказательства корректности параллельного протокола взаимодействий, а это действительно сложно). Кроме того, возникающие при использовании защищенных типов исключительные ситуации Ada обрабатывает автоматически, а при реализации обработки таких ситуаций "вручную" легко что-то напутать. И, наконец, защищенные типы могут быть более эффективными.

Один из возможных часто используемых вариантов применения защищенных типов - это реализация очереди буферизации сообщений между задачами. Смотите пример из Ada Rationale (Часть 2, раздел 9.1.2) (защищенный тип из Mailbox_Pkg).


К этому разделу упражнение отсутствует.

Вы можете перейти к следующему разделу.


Вы можете также:

PREVIOUS Вернуться к предыдущему разделу

OUTLINE Вернуться к содержанию Урока 13

David A. Wheeler ([email protected])

Перевод:   Общая редакция перевода:

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s13s4.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org