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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.