2010-02-05 289 views
1

我们有多线程应用程序。每个线程在初始化时都必须调用CoIntialize,因为我们使用一些C++ COM对象来执行我们的数据库操作。该应用程序在生产环境中的工作时间较长。但是突然间,线程初始化函数中的CoIntialize()API失败,出现以下错误 ThreadInit; HRESULT:80070008:没有足够的存储空间来处理此命令。 操作系统:带有SP2的Windows Server 2003 R2。我在stackoverflow 中发现了一个工作,在Windows注册表中将控制台应用程序的堆积从512 KB增加到1MB。我可以做到这一点。但我想知道这可能首先发生的可能原因是什么。 env最近没有改变。在该机器上运行的其他几个进程可以在没有任何问题的情况下调用Coinitialize。它只有两个过程失败。在此先感谢CoInitialize失败

+0

指数地方? – RobS 2010-02-06 02:37:33

+0

这是一个变量。它可能是7到64之间的任何值。发生问题时,我看不到超过10个线程正在运行。谢谢 – ipr 2010-02-08 16:50:49

回答

0

CoInitialize“初始化当前线程上的COM库”,它具有内存要求。

我的猜测是,您的生产环境达到了应用程序的堆大小不足以在新线程上初始化COM的程度。也许你碰到了一个你分配了比以前更多的线程的场景,即使这个应用程序运行的时间不长。

提高堆大小可以解决这个问题,因为它可以让这些线程正确初始化。

+0

谢谢 我在等待客户对dheamon总结报告的反馈。这将帮助任何堆大小问题 – ipr 2010-02-08 16:48:51

+0

我已经给出了增加堆的选项,它会运行几天。我没有再次报告同样的问题。谢谢 – ipr 2010-02-24 20:20:24

1

某处泄漏了某处。首先假定它是你的程序。您可以通过Taskmgr.exe,进程选项卡,查看+选择列以及勾选句柄,GDI对象和USER对象来观察它的句柄用法。在您的应用运行时观察这些数字。如果他们稳步爬升,那么你的代码泄露了句柄。一旦一列达到10,000,节目结束。

一个更晦涩的解释是内核内存池中的空间不足。在“性能”选项卡的Taskmgr中也可见。

0

是否有机会从DLLMain调用CoInitialize,更重要的是,在DLL_THREAD_ATTACH上?这很可能会导致死锁或导致泄漏。

我想多少个线程您使用的发生内存泄漏周围的Thread Local Storage