Threding model
От: john  
Дата: 03.05.01 08:20
Оценка:
Всем привет!
Господа помогите разобраться вот с чем... — совсем запутался..

Имеем ЕХЕ СОМ — сервер. Применительно ли к нему понятие MTA и STA модели?
или это все только для ДЛЛ-серверов?

Если да (т.е. применимо), то скажите плиз:
— я понимаю, что если мы имеем клиента для этого СОМ-ЕХЕ сервера и у него
(клиента) есть несколько потоков (а сервер работает как MTA), то все эти
вызовы идут к серверу параллельно.
Объясните тогда вот что... Если имеем сервер (ЕХЕ) работающий одним
инстансом в системе и к нему 2 СОМ-клиента, то.. вызовы от этих СОМ-клиентов
будут идти как от разных процессов. И в таком случае они (при MTA работе
сервера) будут тоже выполнены параллельно или будут выстроены в
последовательную очередь?

Короче меня интересует как организуется очередь вызовов не между потоками,
а между процессами... в случае MTA и STA модели для ЕХЕ серверов
Re: Threding model
От: alexf США  
Дата: 05.05.01 06:49
Оценка:
Здравствуйте john, 05.02.2001 02:20:53 вы писали:

>Имеем ЕХЕ СОМ — сервер. Применительно ли к нему понятие MTA и STA модели?

>или это все только для ДЛЛ-серверов?

Наблюдается некоторая путаница в понятиях. MTA и STA — это типы апартментов (как это
понятие принято называть по-русски?), в то время как потоковые модели DLL-серверов
включают Single, Apartment, Free и Both (а также Neutral в Win2K). Типы апартментов
и потоковые модели это разные вещи. Потоковая модель показывает в каком апартменте
может быть создан объект. Объекты с моделями Single и Apartment могут жить только в
STA, Free — только в MTA, Both — как в STA, так и в MTA.

В процессе может быть не более одного MTA и произвольное количество STA. Каждый поток
процесса либо входит в MTA, либо составляет собой STA. Принадлежность потока определяется
тем как в нем была инициализирована библиотека COM. Это будет MTA, если был вызов
CoInitializeEx с флагом COINIT_MULTITHREADED, и STA в остальных случаях. (Для полноты
картины: если поток вообще не инициализировал COM, он по умолчанию попадает в MTA, но
это деталь реализации и на нее не стоит полагаться).

>Если да (т.е. применимо), то скажите плиз:


Применимо в том смысле, что EXE-сервер может по своему желанию создавать объекты как
в STA, так и в MTA. Объекты, реализованные в DLL, в этом смысле пассивны — апартмент,
в который они попадают зависит от потоковой модели DLL и от того в каком потоке был
вызов CoCreateInstance и не зависит от воли сервера. EXE-сервер может создавать свои
объекты в том апартменте, в котором захочет.

>- я понимаю, что если мы имеем клиента для этого СОМ-ЕХЕ сервера и у него

>(клиента) есть несколько потоков (а сервер работает как MTA), то все эти
>вызовы идут к серверу параллельно.

>Объясните тогда вот что... Если имеем сервер (ЕХЕ) работающий одним

>инстансом в системе и к нему 2 СОМ-клиента, то.. вызовы от этих СОМ-клиентов
>будут идти как от разных процессов. И в таком случае они (при MTA работе
>сервера) будут тоже выполнены параллельно или будут выстроены в
>последовательную очередь?
>
>Короче меня интересует как организуется очередь вызовов не между потоками,
>а между процессами... в случае MTA и STA модели для ЕХЕ серверов

Вызовы ведь идут не просто в EXE-сервер, вызовы идут какому-то конкретному
объекту в EXE-сервере. Если объект создан в MTA, то вызовы будут обрабатываться
параллельно и независимо в разных потоках EXE-сервера. Если объект создан в STA,
то вызовы будут сериализованы, то есть будут выполняться последовательно в том
потоке сервера, который составляет этот STA.

Не уверен, что помог разобраться, скорее наоборот запутал :) Ничего, задавай
еще вопросы, будем разбираться.
-- Alex Fedotov
Re: Threding model
От: sanyvaa  
Дата: 29.05.01 09:27
Оценка:
Здравствуйте john, вы писали:

J>Всем привет!

J>Господа помогите разобраться вот с чем... — совсем запутался..

J>Имеем ЕХЕ СОМ — сервер. Применительно ли к нему понятие MTA и STA модели?

J>или это все только для ДЛЛ-серверов?

J>Если да (т.е. применимо), то скажите плиз:

J>- я понимаю, что если мы имеем клиента для этого СОМ-ЕХЕ сервера и у него
J>(клиента) есть несколько потоков (а сервер работает как MTA), то все эти
J>вызовы идут к серверу параллельно.
J>Объясните тогда вот что... Если имеем сервер (ЕХЕ) работающий одним
J>инстансом в системе и к нему 2 СОМ-клиента, то.. вызовы от этих СОМ-клиентов
J>будут идти как от разных процессов. И в таком случае они (при MTA работе
J>сервера) будут тоже выполнены параллельно или будут выстроены в
J>последовательную очередь?

J>Короче меня интересует как организуется очередь вызовов не между потоками,

J>а между процессами... в случае MTA и STA модели для ЕХЕ серверов


Я как раз в данный момент делаю что-то похожее, пришлось некоторое время разбираться с потоковыми моделями COM, могу сказать следующее:

— во-первых, нужно различать паралельность доступа к разным объектам и доступ к одному и тому же объекту
из разных потоков (если потоки разделяют между собой указатель на интерфейс реализуемый одним и тем же объектом, в данном случае требуется маршалить этот указатель между потоками, если только они не созданы все в одном МТА-апартменте). Если паралельно выполняются вызовы к разным объектам, то они будут действительно параллельны если объекты созданы либо в МТА либо в разных STA-апартментах. Если паралельно выполняются вызовы к одному объекту, то параллельность будет только в случае МТА. Если же все объекты серевера созданы в одном STA-апартменте, то все вызовы от всех потоков клиента ставятся в очередь и никакой параллельности не будет.

— о том как задать апартмент для серверного объекта: у объектов локального сервера значение ключа ThreadingModel не используется, о том куда они попадут (main STA, STA или МТА) заботится фабрика класса объекта (точнее поток, в котором она работает). Если в потоке, который создает объекты указать CoInitializeEx(NULL, COINIT_MULTITHREADED), то он попадет в МТА-апартмент и создаваемые им объекты — также. По умолчанию (если не ошибаюсь) объекты попадут в main STA-апартмент.

— и наконец о клиенте: насколько я понимаю, в случае локального сервера не имеет практически никакого значения в смысле обеспечения параллельности вызовов куда помещаются потоки клиента: в STA или MTA, все равно объекты сервера попадут в другие апартменты и вызовы к ним будут маршалиться. Пожалуй разница только в том, что в случае МТА не нужно маршалить между потоками общие указатели на интерфейсы, а также при использовании обратных вызовов (от сервера к клиенту).

А еще очень советую прочитать статью "Понимание подразделений COM" на этом сайте — все сразу станет понятно через пару дней после прочтения :)

----------------
SANY
Re[2]: Threding model
От: Odissey Россия http://malgarr.blogspot.com/
Дата: 29.05.01 11:14
Оценка:
Здравствуйте sanyvaa, вы писали:

S>А еще очень советую прочитать статью "Понимание подразделений COM" на этом сайте — все сразу станет понятно через пару дней после прочтения :)


Через пару дней после третьго прочтения :-)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.