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