Модели потоков. Инициализация СОМ (окончание)

   
На этом шаге мы рассмотрим особенности создание различных моделей потоков.

   
Отдельного обсуждения заслуживает инициализация модели потоков СОМ для сервера, реализованного в виде DLL. Дело в том, что библиотека DLL
может быть загружена любым потоком, который уже ранее создал свой апартамент. Поэтому сервер в виде DLL не может сам проинициализировать требуемую ему
модель потоков. Вместо этого сервер при регистрации прописывает в реестре параметр ThreadingModel, который и указывает, в какой модели потоков способен
работать данный сервер. При создании сервера СОМ анализирует значение этого параметра и при необходимости создает для сервера апартамент с требуемой
моделью потоков (рисунок 1).


Рис.1. Запись в системном реестре, определяющая модель потоков внутрипроцессного сервера

   
Параметр ThreadingModel может принимать следующие значения:

  • Single - сервер не предоставляет поддержки потоков, СОМ упорядочивает запросы клиентов к приложению, в каждый момент времени может
    обслуживаться не более одного запроса;
  • Apartment - сервер может работать только в STA, если он создается из STA, то появится в апартаменте вызывающего потока, если из
    МТА - СОМ автоматически создаст для него однопоточный апартамент и прокси в апартаменте клиента;
  • Free - сервер может работать только в МТА, если он создается из МТА, то появится в апартаменте вызывающего потока, если из
    STA - COM автоматически создаст для него многопоточный апартамент и прокси в апартаменте клиента;
  • Both - сервер может работать как в STA, так и в МТА, объект всегда создается в вызывающем апартаменте;
  • Neutral - сервер поддерживает модель нейтральных потоков, объект создается в специальном апартаменте, который, в свою очередь, создается автоматически
    (обратите внимание на невозможность создания апартамента с моделью нейтральных потоков при помощи функции CoInitialize).

   
Если параметр ThreadingModel не задан, сервер по умолчанию получает модель одного потока. В этом случае он создается в главном (primary) однопоточном
апартаменте (то есть в STA потока, который первым вызвал процедуру CoInitialize), даже если создание сервера запрошено из потока, имеющего собственный
однопоточный апартамент.

   
При создании СОМ-сервера средствами Delphi его модель потоков задается в мастере COM Object Wizard (рисунок 2).


Рис.2. Выбор модели потоков на этапе создания СОМ-сервера

   
Обсудим значения, доступные в раскрывающемся списке Threading Model и определяющие модель потоков сервера (действие выбранного значения зависит от
типа сервера - ЕХЕ или DLL).

  • Single - модель одного потока (single-threaded model). Нет поддержки потоков. Для DLL-сервера при регистрации не будет создан параметр
    ThreadingModel. Для ЕХЕ-сервера выбор этого значения (в отличие от любого другого) не приведет к установке флага IsMultiThread, поэтому будет
    создан однопоточный апартамент. Обычно эта модель используется для внутренних серверов.
  • Apartment - модель разделенных потоков (apartment-threaded model). Для DLL-сервера в реестре будет создан параметр ThreadingModel,
    равный значению Apartment, для ЕХЕ-сервера будет создан однопоточный апартамент.
  • Free - модель свободных потоков (free-threaded model). Для DLL-сервера в реестре будет создан параметр ThreadingModel, равный
    Free, для ЕХЕ-сервера будет создан многопоточный апартамент.
  • Both - модель смешанных потоков (both-threaded model). Для DLL-сервера в реестре будет создан параметр ThreadingModel, равный Both,
    для ЕХЕ-сервера будет создан многопоточный апартамент.
  • Neutral - модель нейтральных потоков (neutral-threaded model). Для DLL-сервера в реестре будет создан параметр ThreadingModel, равный
    Neutral, для ЕХЕ-сервера будет создан многопоточный апартамент.

   
При выборе значения в раскрывающемся списке Threading Model не предпринимается никаких дополнительных действий по обеспечению корректности работы создаваемого
сервера в выбранной модели потоков. Поэтому вы сами должны продумать, какие потоки могут быть созданы в вашем приложении, и предпринять меры по их синхронизации. Общие
правила, которые при этом надо учитывать, перечислены ниже.

  • Если все СОМ-серверы создаются в одном однопоточном апартаменте и этот апартамент создан в потоке, в котором работают клиенты этих серверов, не
    требуется никаких мер по синхронизации, поскольку вся синхронизация будет автоматически обеспечена СОМ.
  • Если серверы и клиенты работают в разных апартаментах, независимо от их типов следует синхронизировать доступ к глобальным переменным.
  • Если несколько серверов работают в одном одноноточном апартаменте, можно не заботиться о синхронизации доступа к полям объектов, реализующих эти серверы.
  • Если серверы работают в многопоточном апартаменте, следует синхронизировать доступ как к глобальным переменным, так и к полям объектов, реализующих эти серверы.

   
Следует немного подробнее остановиться на модели нейтральных потоков. Эта модель работает под управлением СОМ+; при отсутствии поддержки этой технологии она
будет использоваться как модель разделенных потоков. Так же как и в модели свободных потоков, клиенты могут обращаться к методам из разных потоков. Отличие модели
нейтральных потоков от модели свободных потоков заключается в следующем: метод сервера всегда вызывается в контексте вызывающего потока. Требования к объекту при его
разработке такие же, как к объекту с моделью смешанных потоков. Далее рассматриваются вопросы синхронизации процессов и потоков в Windows. Эти вопросы не являются
уникальными для СОМ-приложений и касаются любых многопоточных приложений.

   
Со следующего шага мы начнем рассмотривать синхронизацию процессов.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий