2009-05-14 9 views
3

J'ai un composant COM qui est instancié dans un service COM (ce fichier .exe est en cours d'exécution).Comment les threads sont-ils créés dans un composant COM?

J'ai dix clients. Chaque client obtient un pointeur d'interface (IXyz) de ROT et appelle une méthode IXyz :: abc() en même temps. De mes traces, je vois que IXyz :: abc() est appelé 10 fois en même temps, mais dans 10 threads différents.

Qui crée ces 10 threads?

Répondre

0

Le sous-système COM le fait. Il crée un thread séparé pour le traitement des différents appels invoqués en même temps. Si le composant est MTA, les requêtes sont exécutées en parallèle, s'il s'agit de STA, elles sont exécutées une à la fois pour empêcher la corruption des variables partagées.

2

Le comportement COM a du sens si vous y réfléchissez. Le code s'exécute dans le processus de service. Si vous marquez la classe à exécuter dans Single Threaded Apartment, un seul thread s'exécute à la fois. Les appels simultanés sont empilés dans le message qeueu s'exécutant un à la fois. Si un appartement multithread est spécifié, le code peut s'exécuter simultanément. Pour accomplir cela dans le processus en cours, plusieurs threads sont lancés pour obtenir ce comportement.

Si vous souhaitez éviter les problèmes de concurrence, vous devez placer votre classe dans une DLL. Ensuite, vous avez toujours plusieurs threads mais chacun s'exécute dans le processus d'appel, vous n'avez donc pas besoin de vous soucier de l'état.

Il n'existe aucun moyen d'exécuter un bloc de code simultanément sans threads. Même si vous exécutez des processus séparés, il existe encore plusieurs threads impliqués, ils sont simplement séparés par les limites du processus.

Je ne fais que souligner l'obviouse parce que j'ai déjà travaillé pour une entreprise qui ne pouvait tout simplement pas comprendre cela. :-) Ils pensaient pouvoir éviter les problèmes de threading en s'exécutant dans des processus séparés et en utilisant de la mémoire partagée (fichiers mappés en mémoire)! Cela a fonctionné (sorte de) quand leur code a couru sur un seul processeur et ils ont ajouté une application de «réparation» pour corriger les incohérences. Lors de la dernière installation, ils sont passés à plusieurs processeurs et tout s'est vraiment effondré. Puis je suis parti, la fin.

Questions connexes