Как потоки создаются внутри COM-компонента? - PullRequest
3 голосов
/ 14 мая 2009

У меня есть один компонент COM, который создается внутри службы COM (этот .exe работает).

У меня десять клиентов. Каждый клиент получает указатель интерфейса (IXyz) из ROT и одновременно вызывает метод IXyz :: abc ().

Из своих следов я вижу, что IXyz :: abc () вызывается 10 раз одновременно, но в 10 разных потоках.

Кто создает эти 10 тем?

Ответы [ 2 ]

2 голосов
/ 14 мая 2009

Поведение COM имеет смысл, если вы об этом думаете. Код выполняется внутри сервисного процесса. Если вы отметите класс для запуска в Single Threaded Apartment, то одновременно будет выполняться только один поток. Параллельные вызовы суммируются в сообщении qeueu, которое выполняется по одному. Если указана многопоточная квартира, то код может выполняться одновременно. Для достижения этой цели в процессе работы несколько потоков запускаются для достижения этого поведения.

Если вы хотите избежать проблем с параллелизмом, вам нужно поместить свой класс в dll. Тогда у вас все еще есть несколько потоков, но каждый из них выполняется в вызывающем процессе, поэтому вам не нужно беспокоиться о состоянии.

Невозможно выполнить любой блок кода одновременно без потоков. Даже если вы выполняете в отдельных процессах, все еще задействовано несколько потоков, они просто разделены границей процесса.

Я только использую obviouse, потому что я когда-то работал в компании, которая просто не могла получить это через их головы. :-) Они думали, что могут избежать проблем с многопоточностью, выполняя отдельные процессы и используя общую память (файлы с отображением в памяти)! Это работало (вроде), когда их код работал на одном процессоре, и они добавили приложение «исправление», чтобы исправить несоответствия. При последней установке они перешли на несколько процессоров, и все действительно развалилось. Затем я ушел, конец.

0 голосов
/ 14 мая 2009

Подсистема COM делает это. Он создает отдельный поток для обработки разных вызовов, вызванных одновременно. Если компонент является MTA, запросы выполняются параллельно, если это STA, они выполняются по одному, чтобы предотвратить повреждение общих переменных.

...