我正在尝试创建一个服务器(多线程),但我遇到了一个问题:它正在填满内存。所以我决定做一个简单的测试。以下是main中的代码:
int main(void)
{
int x;
while(1)
{
cin>>x;
uintptr_t thread = 0;
//handle(NULL);
thread = _beginthread(handle, 0, NULL);
if (thread == -1) {
fprintf(stderr, "Couldn't create thread: %d\n", GetLastError());
}
}
}
这是'手柄'功能:
void handle(void *)
{
;
}
我打开任务管理器,我正在那里查看我的进程需要多少RAM。 如果函数main是你现在看到的,每按一次键1然后按回车键(这样内部的东西就会执行),进程占用的RAM增加4k(基本上,每次创建线程)或类似的东西,它将泄漏4k的内存)。如果我多次这样做,它会不断增加,每次都是4k。
如果在函数main中我评论了这个' thread = _beginthread(handle,0,0);'并取消注释' //句柄(NULL);',然后该过程不会增加它的RAM内存。
任何人都有任何想法如何释放4k内存?
我正在用codeblocks编译它,但是同样的结果是用visual studio编译它。
编辑:来自MSDN:"当线程从该例程返回时,它会自动终止。" 我也放了' _endthread();'在我的句柄功能,但结果是相同的!
答案 0 :(得分:2)
每次循环时,该程序都会创建一个新线程。该程序永远不会关闭任何线程。
我认为你所展示的是创建一个线程的内存成本大约是4K。
假设你不想要越来越多的线程,要么在创建另一个之前关闭一个,要么在你已经足够的时候放弃。
经过进一步思考,以上是错误的。我尝试过你的程序,它不会也不能做你说的,除非你遗漏了一些重要的故事。
handle
函数完成时终止。这是我编写的代码,适应你的。
#include <iostream>
#include <Windows.h>
#include <process.h>
using namespace std;
int nthread = 0;
void handle(void *) {
nthread++;
}
int main(int argc, char* argv[]) {
while(nthread < 50000) {
cout << nthread << ' ';
uintptr_t thread = 0;
thread = _beginthread(handle, 0, NULL);
if (thread == -1) {
fprintf(stderr, "Couldn't create thread: %d\n", GetLastError());
break;
}
}
}
它运行50,000次迭代,总共使用不到1MB的内存。完全符合预期。
有些东西没有加起来。
答案 1 :(得分:0)
每个线程都需要一些内存来支持它自己的基础设施,这就是4K。当线程终止时(这取决于你的实现),这个4K将被释放。您应该使用API函数来连接子线程,因此您应该保留句柄。直接调用handle函数只是一个函数调用,在这种情况下没有分配内存。
编辑:
您的“句柄”功能会立即终止。据我所知(至少对于posix / linux),在创建时有一些选项可以自动释放内存,或者需要加入。您看到的一个线程是进程本身的“主要”线程。这样你的程序就会产生内存泄漏。