7
votes

Utilisation de AppDomains pour paraller plusieurs dll sans thread

J'ai une dll c ++ non gérée que mon application .NET utilise via p / invoke. La méthode dont j'ai besoin de cette DLL est assez pratiquée et je voudrais paralleraliser les appels de méthode. Le problème est qu'il utilise un tas de statiques et de globaux, de sorte qu'il ne s'agit pas de fil-coffre-fort (et ne peut pas être changé). Mon plan était de surmonter ce problème sans fil-sécurité en appelant la DLL non gérée de plusieurs appdomions en parallèle.

Je peux appeler le code non géré des multiples appdomains sans aucun problème tant que je ne le fais pas en parallèle, mais dès que je fais les appels en parallèle, je reçois un AccessViolationException . J'utilise parallèle.Pour () pour faire les appels parallèles.

est-il possible de faire une DLL non gérée non gérée non gérée par la DLL non gérée non gérée par la DLL non gérée non gérée par «thread-coffre-fort» non géré en faisant simplement les appels de plusieurs appdomains?


1 commentaires

Pour les DLL non gérés qui ne jouent pas bien avec la multithreading, l'isolement de processus est imho beaucoup plus facile que les AppDomains.


3 Réponses :


7
votes

appeler la méthode native à partir de plusieurs AppDomain Les instances ne vous aideront pas du tout ici. AppDomain Les limites ne s'appliquent pas aux DLL natif et ils ne fourniront aucun avantage


0 commentaires

2
votes

4 commentaires

C'est une idée intéressante que je vais essayer. Donc, si je charge plusieurs copies de la même DLL, pourquoi chaque instance doit-elle être appelée à partir du même thread?


Comme je l'ai dit, c'était (bordé sur) la paranoïa. Techniquement, le code pourrait dépendre des caches locales de la CPU; J'aurais besoin de relire des documents ici car ma mémoire de celui-ci par rapport aux commutateurs de contexte est assez accidenté en ce moment. Il suffit de dire, dans de telles circonstances, je m'attendrais à ce que la DLL natif de gérer sa propre affinité du fil, vraiment parce que ce problème n'est pas vraiment limité à l'utilisation d'une application .NET du tout). Donc: ne vous inquiétez pas :)


Étant donné que cette dll natif (native.dll) utilise des variables globales et statiques, plusieurs copies de ces variables sont créées en mémoire lorsque je charge native1.dll, native2.dll, native2.dll, natif3.dll, etc. Pour que je puisse donc les utiliser en parallèle?


@dewald: Oui. C'est-à-dire normalement. Toutes les allocations dynamiques sont ... Dynamique De toute façon, et le type de données est copié en vertu du fait que vous chargez des copies réelles de l'image. La seule chose qui pourrait vous trébucher est l'utilisation de pipes nommées, de cartes mémoire partagées et de primitives de synchronisation interprocesses; Vous pouvez voir ce qui est utilisé avec E.G. Explorateur de processus ou Garde . Assurez-vous de déterminer ce que votre propre application utilise pour contraste



0
votes

Enveloppez la DLL C ++ dans une exe et parallèle des invocations de processus (au lieu d'exécuter ce code dans des threads ou des appdomains). J'ai eu ce problème avec Geckofx, qui n'aime pas les threads, et cette solution a bien fonctionné. Bien sûr, il vous appartient de gérer la communication avec ces processus. Je blogué à propos de ce il y a quelque temps.


0 commentaires