以下代码是我的整个测试程序。每次按ENTER键时,进程正在使用的RAM都会增加4k(它会不断增加,不会停止;我会通过任务管理器看到它)。怎么了? _beginthread也会发生同样的事情。
我正在尝试编写服务器,我想用线程处理每个连接。 (请注意,这意味着我无法加入该线程,因为这会暂停主线程接受新连接。)
unsigned __stdcall thread_test(void *)
{
for(int i = 0; i < 10000; i++)
{
i+=1;
i-=1;
} //simulating processing
_endthreadex( 0 );
}
int main()
{
HANDLE hThread;
while(1)
{
getchar();
hThread = (HANDLE)_beginthreadex( NULL, 0, thread_test, 0, 0, NULL );
CloseHandle( hThread );
}
}
使用代码块和visual studio编译。
编辑:我做了一些测试,一旦达到133.000K左右,内存就会停止填充(当程序启动时,内存大约为800k);但是在这个阶段,程序运行速度比开始时慢4-5倍(内存越高 - 程序运行越慢),因此我的服务器运行起来并不好。编辑2:我有Visual Studio 2013,问题就不存在了。
编辑3:如果我在Visual Studio 2013中测试上面的代码,它不会泄漏。但是如果我使用带有小服务器代码的beginthreadex,它会像以前一样泄漏,每个请求给出4k。这是我使用http://pastebin.com/EDmJXkZU的服务器测试代码(它什么都不做,只是为了看它泄漏了内存)。您可以通过在浏览器的地址栏中键入IP来编译并测试它。
答案 0 :(得分:0)
任务管理器未显示程序使用的RAM。为了更好地查看,请使用任务管理器的资源监视器并观察专用字节指示。但是所有内存监视器仅显示“虚拟内存”,它通常由运行时库保留,而不是释放回Windows。你没有真正的问题。