Всем привет!
Господа помогите разобраться вот с чем... — совсем запутался..
Имеем ЕХЕ СОМ — сервер. Применительно ли к нему понятие MTA и STA модели?
или это все только для ДЛЛ-серверов?
Если да (т.е. применимо), то скажите плиз:
— я понимаю, что если мы имеем клиента для этого СОМ-ЕХЕ сервера и у него
(клиента) есть несколько потоков (а сервер работает как MTA), то все эти
вызовы идут к серверу параллельно.
Объясните тогда вот что... Если имеем сервер (ЕХЕ) работающий одним
инстансом в системе и к нему 2 СОМ-клиента, то.. вызовы от этих СОМ-клиентов
будут идти как от разных процессов. И в таком случае они (при MTA работе
сервера) будут тоже выполнены параллельно или будут выстроены в
последовательную очередь?
Короче меня интересует как организуется очередь вызовов не между потоками,
а между процессами... в случае MTA и STA модели для ЕХЕ серверов
Здравствуйте 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.
Не уверен, что помог разобраться, скорее наоборот запутал :) Ничего, задавай
еще вопросы, будем разбираться.
Здравствуйте 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" на этом сайте — все сразу станет понятно через пару дней после прочтения :)
Здравствуйте sanyvaa, вы писали:
S>А еще очень советую прочитать статью "Понимание подразделений COM" на этом сайте — все сразу станет понятно через пару дней после прочтения :)