2013-04-08 45 views
2

我有一個使用大量線程的應用程序。大多數這些線程是由我無法控制的第三方dll創建的。是否有可能更改默認線程堆棧大小爲不在您控制的dll C++ win32

爲了減少虛擬內存的使用量,我將可執行文件的默認堆棧大小設置爲0.5MiB(而不是默認的1MiB)。這減少了超過500 MiB的地址空間使用,這非常有用,因爲XP(不幸)具有2GiB的虛擬內存限制。

我最近不得不將另一個第三方dll集成到應用程序中,導致在此級別的堆棧溢出,因此我必須將默認堆棧大小設置爲1MiB。

DLL正在創建一個單獨的線程,它是導致問題的線程,所以我無法通過在使用CreateThread選項的應用程序中使用DLL的線程上指定線程大小來控制它。

所以我的問題是有反正拿到DLL有超過可執行內螺紋不同的默認堆棧大小,因爲我不能編輯該DLL

+1

你究竟在努力解決什麼問題?如果內存不足,堆棧中未使用的部分應該無關緊要,因爲它是按「需求」分配的 - 即使不是由於某種原因,也應該可以交換出去,永遠不會再使用。 不知道哪個第三方庫,我會說你要求一個無法找到的解決方案。 – 2013-04-08 15:58:36

+1

是的,我知道它是按需分配的,但它確實佔用了虛擬內存空間,這在XP上不幸(在XP上)會使應用程序停留在2GiB上。這是一個內存沉重的應用程序。我知道這可能是那些不幸的不可修復的問題之一,但值得問一下以防萬一。 – user2258296 2013-04-08 16:10:08

+0

對於運行*千*線程的進程,您可以使用合理的東西並不是一件完整的事情。這是不合理的。指定一個64位操作系統,使用/ LARGEADDRESSAWARE進行鏈接,您將使VM大小加倍。然後去找另一份工作。 – 2013-04-08 17:16:03

回答

1

你可能會需要使用Detours或其他代碼PE掛鉤代碼將DLL的導入CreateThread()重定向到您自己的實現存根,將蹦牀轉換爲使用dwStackSize參數的不同值的原始導入函數。這樣,你的主應用程序的線程可以使用0.5MB,DLL的線程可以使用1.0MB。

+0

如果DLL的線程有時需要所有空間會怎麼樣?除此之外,沒有簡單的答案:在解決方案上與DLL的供應商合作,或者找到替代品。不管怎樣黑客攻擊都值得一試。 – Kaz 2013-04-09 03:24:37

+0

這是我能想到的唯一可能的事情,但在我看來,這將是一個明確的最終選擇。 @Kaz我已經跟供應商談過了,但我想知道是否有另一個解決方案可以用來更新沒有發生。正如在上面另一個評論中指出的那樣,我們的應用程序使用1000個線程是不合理的,但這是世界的方式。 – user2258296 2013-04-09 07:03:18

相關問題