2010-02-05 5 views
1

Nous avions une application multi-thread. Chaque thread doit invoquer CoIntialize lorsqu'il est initialisé car nous utilisons un objet COM C++ pour notre opération DB. L'application fonctionne bien pour plus de temps dans l'environnement de production. Mais tout à coup, l'API CoIntialize() dans la fonction d'initialisation du thread a échoué avec l'erreur ci-dessous: ThreadInit; HRESULT: 80070008: Stockage insuffisant pour traiter cette commande. Système d'exploitation: Windows Server 2003 R2 avec SP2. J'ai trouvé un travail autour de stackoverflow pour augmenter la taille de l'application console de 512 Ko à 1 Mo dans le registre Windows. Je peux le faire. Mais je veux savoir quelle est la raison possible pour que cela arrive en premier. L'env n'a pas changé récemment. Il existe plusieurs autres processus en cours d'exécution dans cette machine, ils peuvent appeler Coinitialize sans aucun problème. Il a échoué pour seulement deux processus. Merci d'avanceCoInitialize a échoué

+0

Combien de threads utilisez-vous? – RobS

+0

C'est un nombre variable. Cela peut être n'importe quoi entre 7 et 64. Quand le problème est arrivé, je ne vois pas plus de 10 threads en cours d'exécution. Merci – ipr

Répondre

0

CoInitialize "initialise la bibliothèque COM sur le thread en cours", qui nécessite une mémoire. Je suppose que votre environnement de production a atteint un point où la taille du tas de l'application n'était pas suffisante pour initialiser COM sur le nouveau thread. Vous avez peut-être atteint un scénario dans lequel vous avez alloué plus de threads que précédemment, même si l'application ne fonctionnait pas aussi longtemps.

L'augmentation de la taille du tas corrige cela, car cela permettrait à ces threads de s'initialiser correctement.

+0

Merci J'attends les commentaires des clients sur le rapport sommaire dheamon. Cela aidera n'importe quel problème de taille de tas – ipr

+0

J'avais donné l'option d'incrémenter le tas, il court pendant quelques jours. Je n'ai pas eu le même problème signalé à nouveau. Je vous remercie – ipr

1

Quelque chose fuit quelque part. Commencez par supposer que c'est votre programme. Vous pouvez observer son utilisation de la poignée avec Taskmgr.exe, l'onglet Processus, View + Select et cocher les poignées, les objets GDI et les objets USER. Observez ces chiffres pendant que votre application est en cours d'exécution. Si elles grimpent régulièrement, alors vous fuyez poignées dans votre code. Le spectacle est terminé une fois qu'une colonne atteint 10 000.

Une explication plus obscure est à court d'espace dans le pool de mémoire du noyau. Aussi visible dans Taskmgr depuis l'onglet Performance.

0

Y at-il une chance que vous appelez CoInitialize de DllMain, d'autant plus, sur DLL_THREAD_ATTACH? Cela entraînerait très probablement une impasse ou des fuites.

Je suppose une fuite de mémoire se produit quelque part autour de l'index de Thread Local Storage

Questions connexes