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. P>
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 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? P> AccessViolationException code> . J'utilise parallèle.Pour () pour faire les appels parallèles. P>
3 Réponses :
appeler la méthode native à partir de plusieurs AppDomain code> Les instances ne vous aideront pas du tout ici.
AppDomain CODE> Les limites ne s'appliquent pas aux DLL natif et ils ne fourniront aucun avantage p>
Tout d'abord et avant tout: Chargez plusieurs copies de la DLL dans le même processus < / a> p>
Vous devez vous assurer que toutes les invocations d'une appdomaine sont sur un seul fil. p>
Parallelfor ne peut pas faire cela arriver, alors vous auriez besoin de p>
Notez que, en fonction de la complexité de votre situation (rappels, d'utilisation de données globales dans la bibliothèque gérée), vous pouvez limiter l'exécution de chaque AppDomain à un noyau CPU spécifique (Affinité principale: voir
commence / endtheadaffinité code>
). Je pourrais être un tad paranoïaque ici :) p>
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
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. P >
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.