Шаг 289.
Модели потоков. Инициализация СОМ (окончание)
На этом шаге мы рассмотрим особенности создание различных моделей потоков.
Отдельного обсуждения заслуживает инициализация модели потоков СОМ для сервера, реализованного в виде 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. Эти вопросы не являются
уникальными для СОМ-приложений и касаются любых многопоточных приложений.
Со следующего шага мы начнем рассмотривать синхронизацию процессов.
Предыдущий шаг
Содержание
Следующий шаг