2010-09-13 7 views
1

Si j'appelle la même fonction COM à partir de plusieurs threads à une Dll COM proc in, comment thread est-ce sécurisé?Appels COM à partir de plusieurs threads

Est-ce que tous mes objets dans la DLL COM doivent également être thread-safe pour que cela fonctionne de manière fiable? Dépend du modèle de thread d'objets COM.

+0

Ceci est du C++ natif. –

Répondre

0

Si son filetage libre, alors vous êtes responsable de la sécurité du fil. Si c'est dans un seul appartement fileté, alors vous ne pouvez l'appeler que d'un, et si c'est dans un appartement multithread, alors vous pouvez mais comme toujours, vous devez considérer les implications pour l'état de l'objet. il y a une très bonne réponse sur SO Could you explain STA and MTA? en expliquant cela.

+0

Une DLL COM existante peut-elle être modifiée de STA à MTA ??? –

+0

Pas vraiment. Tout sur la conception du code original. Si le code n'est pas conçu pour être multithread, vous devez alors marshaler l'accès, c'est-à-dire le gérer vous-même. –

+0

Je veux que mes objets COM puissent être appelés simultanément. D'après ma compréhension de STA ce n'est pas possible, mais si le modèle de thread était MTA, ce serait possible? –

2

COM s'occupe de l'enfilage au nom du serveur COM. Le serveur publie le type de thread qu'il prend en charge avec la clé de Registre ThreadingModel. Les paramètres très communs sont Appartement ou Les deux. Gratuit est très rare. Une clé manquante est équivalente à Apartment.

COM nécessite un STA (Single-Threaded Apartment) pour les serveurs cloisonnés d'appartements. Si vous n'en fournissez pas un (appel CoInitialize/Ex), il créera un thread dédié pour le serveur. Une exigence essentielle pour un thread STA est qu'il pompe également une boucle de message Windows. La boucle de message est le mécanisme par lequel COM commute automatiquement un appel de méthode d'un thread à un autre. Donc, la réponse générale à votre question est, oui, il est normalement thread-safe. Il y a encore des choses qui peuvent mal tourner. Un interblocage est possible lorsqu'un appel est effectué à partir d'un thread de travail mais que le thread STA ne fonctionne pas. Ou le serveur pourrait se plaindre du ThreadingModel enregistré. Pas rare avec les serveurs implémentés dans .NET. Ils sont enregistrés comme les deux, mais il existe quelques classes .NET qui sont réellement thread-safe.

1

Voir this very detaled article. Fondamentalement, COM prendra soin de la synchronisation - vous n'avez pas besoin de vous embêter. Cependant, dans certains cas, le consommateur peut subir un ralentissement important en raison de la synchronisation.

Questions connexes