2010-09-13 3 views
1

Если я вызываю одну и ту же функцию COM из нескольких потоков в proc COM Dll, как это безопасно для потоков?COM-вызовы из нескольких потоков

Должны ли все мои объекты в COM-DLL быть потокобезопасными для надежной работы?

+0

Это родной C++. –

ответ

0

Зависит от модели резьбы COM-объектов. Если его свободная резьба, то вы отвечаете за безопасность потока. Если его в однопоточной квартире, то вы можете назвать его только из одного, и если он находится в многопоточной квартире, то вы можете это сделать, но, как всегда, вы должны учитывать последствия для состояния объекта. есть очень хороший ответ на SO Could you explain STA and MTA?, объясняющий это.

+0

Может ли существующая COM-библиотека быть изменена с STA на MTA ??? –

+0

Не совсем. Это все о дизайне исходного кода. Если код не предназначен для многопоточности, то вы должны маршировать доступ - то есть обрабатывать его самостоятельно. –

+0

Я хочу, чтобы мои объекты COM вызывались одновременно. Из моего понимания с помощью STA это невозможно, но если модель потоковой передачи была MTA, это было бы возможно? –

2

COM заботится о потоке от имени COM-сервера. Сервер публикует вид потоковой передачи, поддерживаемый с помощью раздела реестра ThreadingModel. Очень общие настройки - апартаменты или оба. Свободный очень редок. Отсутствующий ключ эквивалентен Apartment.

COM требует однопоточной квартиры (STA) для квартирных многопоточных серверов. Если вы не предоставите один (вызов CoInitialize/Ex), он создаст выделенный поток для сервера. Жестким требованием для потока STA является то, что он также перекачивает контур сообщения Windows. Цикл сообщений - это механизм, с помощью которого COM автоматически марширует вызов метода из одного потока в другой.

Итак, общий ответ на ваш вопрос: да, он, как правило, является потокобезопасным. Есть вещи, которые могут пойти не так. Тупик возможен, когда вызов выполняется из рабочего потока, но поток STA не перекачивается. Или сервер может быть фибробующим о зарегистрированной ThreadingModel. Не редкость с серверами, реализованными в .NET. Они регистрируются как Both, но есть несколько классов .NET, которые фактически поточно-безопасны.

1

См. this very detaled article. В основном COM позаботится о синхронизации - вам не нужно беспокоиться. Однако в некоторых случаях потребитель может испытывать значительное замедление из-за синхронизации.

Смежные вопросы