0
我正在開發使用大量內存和線程的視頻分析引擎。我們支持從XP,Win8.1,Win10到Linux的許多操作系統。Visual Studio 2015存在嚴重錯誤,只能在Windows XP中減少可用虛擬內存
大約兩年前更改爲Visual Studio 2015之後,在XP(32位)中出現了很多問題。
最重要的問題是「減少可用虛擬內存」。 感興趣的是物理內存是穩定的(不增加)。 爲了找到原因,我們在幾個月內進行了許多實驗,最後得出結論說有編譯器錯誤。
// project setting : vs2015, 32bit, use static lib, v140_xp
#include <vector>
#include <afxwin.h>
UINT AvailableVMShortageTestThread(LPVOID param)
{
// Do Nothing!
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
while (1) {
// Create test thread 20000 times!
for(int i = 0; i < 20000; i++) {
CWinThread* thread_ptr = AfxBeginThread (AvailableVMShortageTestThread, 0, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
thread_ptr->ResumeThread();
WaitForSingleObject (thread_ptr->m_hThread, INFINITE);
}
// Display available virtual memory
MEMORYSTATUSEX statex;
statex.dwLength = sizeof(statex);
GlobalMemoryStatusEx(&statex);
printf("ullAvailVirtual:%dMB\n",statex.ullAvailVirtual/(1024 * 1024));
}
return nRetCode;
}
下面的鏈接圖片是vs2010 vs vs2015之間的測試結果圖片。 memory test vs2010 vs vs2015. 在Visual Studio 2015中,重複創建線程會導致Windows XP中的可用虛擬內存減少。 減少可用虛擬內存會產生另一個大問題。 該錯誤無法處理異常並彈出Dr. Watson錯誤消息。
你知道任何解決方案嗎?
CRT對由FlsAlloc()提供的清理線程本地狀態的回調具有嚴格的依賴關係。但XP沒有這個功能,不能提供替代方案。另一個提醒,XP是真正結束並完成。你需要堅持使用VS2010來構建你的程序的XP版本。 –
我們發現另一個有趣的觀點。當只有項目是由靜態lib(而不是多線程DLL)構建時,可用的虛擬內存正在減少。所以,我認爲vs2015靜態lib和dll lib是有區別的。 – JunHo