2010-02-05 57 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