Потоки СОМ

Многопоточность используется для создания приложений с малым временем отклика. Например, в WEB: 1-й поток перекачивает страницу, 2-й отображает, 3-й реализует интерфейс пользователя.

СОМ использует потоки Win32. Для создания и синхронизации потоков используется API Win32. В приложении Win32 имеются потоки двух типов: потоки пользовательского интерфейса (user-interface thread) и рабочие потоки (worker thread).

С потоками пользовательского интерфейса связано одно или несколько окон. Эти потоки имеют циклы выборки сообщений (что обеспечивает работу окна и реакцию на действия пользователей).

Рабочие потоки не связаны с окном, и как правило, не имеют циклов выборки сообщений.

В каждом процессе может быть несколько и тех и других потоков.

Для потока пользовательского интерфейса для каждого окна существует оконная процедура.

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

В СОМ эти же типы потоков называются:

·      разделенный поток (apartment thread) вместо потока пользовательского интерфейса

·      свободный поток (free thread) вместо рабочий поток.

Подразделение это разделенный поток плюс цикл выборки сообщений.

На следующей схеме приведен пример работы подразделения.


 

 

 

 

 

 

 

 

 

 

Цикл выборки

 

 

 

 

CoInitialize

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Клиент

 

Компонент

 

 

 

 

 

 

 

 

(внутри

 

 

 

 

 

 

 

 

процесса)

 

 

Оконная
процедура

 

 

 

Цикл выборки

 

Компонент

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CoUninitialize

 

 

 

 

 

 

 

 

 

 

 

         e                                                                                  e

   Поток управления

 

У компонентов внутри процесса нет своих циклов выборки (используют клиентский цикл выборки сообщений).

Для компонентов вне процесса:

§  есть цикл выборки

§  маршалинг вызовов между процессами

 

На следующих схемахе приведен пример работы потоков, расположенных в разных процессах.

                                                                                     Сервер компонента вне процесса

 

 

 

 

 

 

 

 

CoInitialize

 

 

 

CoInitialize

 

 

 

 

 

 

 

 

 

 

 

 

 

Компонент

 

 

Клиент

 

 

 

Для вызова внутри
процесса маршалинг
не выполняется

 

 

 

 

Для вызова между процессами

 

 

 

 

 

 

необходим маршалинг

 

Компонент

 

 

 

 

 

 

 

 

 

Цикл выборки

 

Цикл выборки

 

Цикл выборки

 

 

 

 

компонента вне процесса

 

 

 

 

 

 

 

 

 

 

 

CoUninitialize

 

 

 

CoUninitialize

 

 

 

 

 

 

 

 

                        e                                                                                           e

 

Компонент внутри процесса,

расположенный в другом

подразделении:

 

 

 

 

 

 

 

 

CoInitialize

 

 

 

CoInitialize

 

 

 

 

 

 

 

 

 

 

 

 

 

Компонент

 

 

Клиент

 

 

 

Для вызова внутри
процесса маршалинг
не выполняется

 

 

 

 

Для вызова между подразделениями необходим

 

 

 

 

 

 

маршалинг

 

Компонент

 

 

 

 

 

 

 

 

 

Цикл выборки

 

Цикл выборки

 

Цикл выборки

 

 

 

 

сообщений используется
процедурой потока

 

 

 

 

 

 

 

 

 

 

 

CoUninitialize

 

 

 

CoUninitialize

 

 

 

 

Границы подразделений

 

 

 

                        e                                                                                           e

Между процессом и подразделением есть общие черты:

§  и у процесса и у подразделения есть свой цикл выборки сообщений;

§  маршалинг вызовов функций внутри однопоточного процесса и внутри подразделения не нужен;

§  имеет место естественная синхронизация, т.к. один поток;

§  и поток и подразделение должны инициализировать библиотеку СОМ.

 

Разделенный поток – это единственный поток внутри подразделения.

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

Разделенный поток владеет созданным им компонентом. Компонент внутри подразделения будет вызываться только "своим" разделенным потоком.

Потокобезопасность обеспечена всегда.

 

Для компонентов, связанных свободными потоками синхронизация не выполняется: если компонент создан свободным потоком он может вызываться любым потоком и в любой момент времени.

Модель свободных потоков переносит заботу о синхронизации с СОМ на компонент.

Компонент, созданный свободным потоком называется компонентом свободных потоков.

Все потоки имеют к такому компоненту свободный доступ. Такому компоненту не нужен цикл выборки сообщений.

 

Для правильного маршалинга и синхронизации вызовов компонента СОМ надо знать потоком какого типа он исполняется.

Для разделенных потоков обычно СОМ выполняет необходимые маршалинг и синхронизацию.

Для свободных потоков маршалинг может быть не нужен, а выполнение синхронизации должен обеспечивать на компонент.

Существуют следующие общие правила по синхронизации потоков и применения маршалинга:

§  вызовы внутри одного потока синхронизируются самим потоком;

§  вызовы посредством свободного потока не могут быть синхронизированы самим потоком;

§  вызовы посредством разделенного потока синхронизируются;

§  вызовы между разными процессами всегда выполняются с применением маршалинга;

§  вызовы внутри одного потока не используют маршалинг;

§  при вызове компонента в разделенном потоке применяется с маршалинг;

§  при вызове компонента в свободном потоке маршалинг применяется не всегда.

 

Возможны следующие типы вызовов:

§  Вызовы внутри одного потока.

И клиент и компонент выполняется в одном потоке и следовательно не нужен маршалинг и вызовы синхронизируются.

§  Разделенный-разделенный

Клиент, выполняется в разделенном потоке и  вызывает компонент, выполняющийся в другом разделенном потоке.

1.    Синхронизацию вызова выполняет СОМ

2.    СОМ также выполняет маршалингш интерфейсов (даже если потоки в одном процессе).

3.    Вызов компонента в разделенном потоке аналогичен вызову компонента вручную.

§  Свободный-свободный

Клиент в свободном потоке вызывает компонент  свободных потоков и следовательно:

1.    Синхронизацию вызова СОМ не выполняет

2.    Вызов будет выполнять поток клиента.

3.    Компонент должен сам синхронизировать доступ к себе.

4.    Если компонент и клиент внутри одного процесса, то маршалинг не выполняется.

§  Свободный-разделенный

Клиент в свободном потоке вызывает компонент в подразделении и следовательно:

1.    Синхронизацию вызова выполняет СОМ

2.    Компонент будет вызван потоком подразделения.

3.    Маршалинг интерфейса необходим (без разницы в одном или в разных процессах оба потока). В большинстве случаев маршалинг выполнит СОМ, но не всегда.

§  Разделенный-свободный

Клиент в разделенном потоке вызывает компонент в свободном потоке  и следовательно:

1.    Синхронизацию вызова СОМ не выполняет

2.    Синхронизацию должен вып. компонент свободного потока.

3.    Маршалинг интерфейса выполняется, но если оба потока принадлежат одному процессу, то СОМ может оптимизировать маршалинг (передав указатели клиенту непосредственно).

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100