Вопрос про апартменты
От: Dimkin Россия  
Дата: 09.07.03 10:31
Оценка:
Всем привет!

Вот решил хорошенько разобраться с апартментами и возник такой вопрос:

Допустим есть у нас такой код:

int _tmain()
{
::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); // поток в STA

::CoCreateInstance(...); // создаем объект с ThreadinModel=Free в потоке в STA

::CoUninitialize();
}

То бишь в потоке в главном STA созадем компонент (кокласс) с потоковой моделью Free
Классики пишут что объект будет помещен в MTA, а доступ к созданному объекту будет через proxy (межапартметный маршалинг STA <-> MTA),
Так вот сам вопрос — а нафига??? Где здесь засада? Ведь сам класс у нас деклариован как полностью потокобезпасный и почему мы должны общаться через посредника?
И еще, насколько я понял, при создании MTA никаких доп. потоков создаваться не должно? Т.е. будет MTA а в нем ни одного потока, или я не прав? А как тогда?

Гуру — просветите!!!
Re: Вопрос про апартменты
От: Tom Россия http://www.RSDN.ru
Дата: 09.07.03 10:48
Оценка:
Здравствуйте, Dimkin, Вы писали:

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


D>Вот решил хорошенько разобраться с апартментами и возник такой вопрос:


D>Допустим есть у нас такой код:


D>int _tmain()

D>{
D> ::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); // поток в STA

D> ::CoCreateInstance(...); // создаем объект с ThreadinModel=Free в потоке в STA


D> ::CoUninitialize();

D>}

D>То бишь в потоке в главном STA созадем компонент (кокласс) с потоковой моделью Free

D>Классики пишут что объект будет помещен в MTA, а доступ к созданному объекту будет через proxy (межапартметный маршалинг STA <-> MTA),
D>Так вот сам вопрос — а нафига??? Где здесь засада?
гы гы. Я тоже не сразу догнал. Засада вот в чём. Допустим поток вошол в STA. Это означает, что он должен иногда крутить цикл выборки чо бы обеспечить реентерабельность (возможность впускать входящие вызовы во время исходящих), для обслуживания входящих вызоыоы. Затем поток вызывает обьект, который free. Так как обьект free то он защищает свои методы при помощи примитивов синхронизации, типа крит. секции итд. Что получаем: При вызове метода, поток , который в STA засыпает, на крит секции и вот тебе потенциальный дедлок.

D>Ведь сам класс у нас деклариован как полностью потокобезпасный и почему мы должны общаться через посредника?

D>И еще, насколько я понял, при создании MTA никаких доп. потоков создаваться не должно? Т.е. будет MTA а в нем ни одного потока, или я не прав? А как тогда?
Создасться MTA. Из него будет экспортирован интерфейс, что приведёт к созданию пула потоков, обеспечивающих входящие в MTA вызовы.
... << RSDN@Home 1.1 beta 1 >>
Народная мудрось
всем все никому ничего(с).
Re[2]: Вопрос про апартменты
От: Dimkin Россия  
Дата: 09.07.03 12:06
Оценка:
Здравствуйте, Tom, Вы писали:

D>>То бишь в потоке в главном STA созадем компонент (кокласс) с потоковой моделью Free

D>>Классики пишут что объект будет помещен в MTA, а доступ к созданному объекту будет через proxy (межапартметный маршалинг STA <-> MTA),
D>>Так вот сам вопрос — а нафига??? Где здесь засада?
Tom>гы гы. Я тоже не сразу догнал. Засада вот в чём. Допустим поток вошол в STA. Это означает, что он должен иногда крутить цикл выборки чо бы обеспечить реентерабельность (возможность впускать входящие вызовы во время исходящих), для обслуживания входящих вызоыоы. Затем поток вызывает обьект, который free. Так как обьект free то он защищает свои методы при помощи примитивов синхронизации, типа крит. секции итд. Что получаем: При вызове метода, поток , который в STA засыпает, на крит секции и вот тебе потенциальный дедлок.

Ага! ТО бишь код прокси делает что-то типа этого — запускает в отдельном потоке вызов метода класса из MTA а сам делает MsgWaitForMultipleObjects ожиадая завершения метода, а заодно делая Message Pumping для приходящих сообщений?
Я прав? Хитро однако!


D>>Ведь сам класс у нас деклариован как полностью потокобезпасный и почему мы должны общаться через посредника?

D>>И еще, насколько я понял, при создании MTA никаких доп. потоков создаваться не должно? Т.е. будет MTA а в нем ни одного потока, или я не прав? А как тогда?
Tom>Создасться MTA. Из него будет экспортирован интерфейс, что приведёт к созданию пула потоков, обеспечивающих входящие в MTA вызовы.

Так а с этого места поподробнее! Куда будет экспортирован интерфейс? А что за пул потоков? Я не очень много вопросов задаю? Просто очень хочется понять всю кухню!!!

СПАСИБО!
Re[3]: Вопрос про апартменты
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 09.07.03 12:10
Оценка:
Здравствуйте, Dimkin, Вы писали:

[]

Ты бы сначала статьи соответствующие прочитал, прежде чем народ мучать.
Re[4]: Вопрос про апартменты
От: Dimkin Россия  
Дата: 09.07.03 12:27
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, Dimkin, Вы писали:


AS>[]


AS>Ты бы сначала статьи соответствующие прочитал, прежде чем народ мучать.


В том то и дело что эти самые вопросы у меня возникли именно после прочтения тех самых СООТВЕТСВУЮЩИХ статей...
Если ты будешь так любезен укзать мне ссылку на то место в этих статьях где есть четкий ответ на мой вопрос то
буду очень благодарен
Re[3]: Вопрос про апартменты
От: Tom Россия http://www.RSDN.ru
Дата: 09.07.03 12:32
Оценка:
D> Так а с этого места поподробнее!
Уф. Попытаюсь.

D>Куда будет экспортирован интерфейс?

Ну когда ты создаёшь обьект free из STA то ты получаешь не обьект а прокси. Прокси этот получаеться путём экспорта интерфейса из MTA (в котором обьект создался) в STA (твой аппартамент).

D>А что за пул потоков?

Входящие вызовы в STA обслуживает поток, который крутит цикл выборки сообщений. Для MTA создаёться пул RPC потоков.

D>Я не очень много вопросов задаю?

Нет. Главное, что если у тебя возникли эти вопросы, то ты уже на правильном пути.

D> Просто очень хочется понять всю кухню!!!

Почитай Д. Бокса книжка "Сущность технологии COM".
... << RSDN@Home 1.1 beta 1 >>
Народная мудрось
всем все никому ничего(с).
Re[5]: Вопрос про апартменты
От: UnrealAlex Россия  
Дата: 09.07.03 13:05
Оценка: 2 (1)
Здравствуйте, Dimkin, Вы писали:

D>Здравствуйте, Alexey Shirshov, Вы писали:


AS>>Здравствуйте, Dimkin, Вы писали:


AS>>[]


AS>>Ты бы сначала статьи соответствующие прочитал, прежде чем народ мучать.


D>В том то и дело что эти самые вопросы у меня возникли именно после прочтения тех самых СООТВЕТСВУЮЩИХ статей...

D>Если ты будешь так любезен укзать мне ссылку на то место в этих статьях где есть четкий ответ на мой вопрос то
D>буду очень благодарен

1. Don Box Chapter 5: Apartments

2. Jeff Prosise Understanding COM Apartments
Part I
Part II
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.