C / C ++线程调用填满内存

时间:2014-05-10 09:38:35

标签: c++ windows

我正在尝试创建一个服务器(多线程),但我遇到了一个问题:它正在填满内存。所以我决定做一个简单的测试。以下是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();'在我的句柄功能,但结果是相同的!

2 个答案:

答案 0 :(得分:2)

每次循环时,该程序都会创建一个新线程。该程序永远不会关闭任何线程。

我认为你所展示的是创建一个线程的内存成本大约是4K。

假设你不想要越来越多的线程,要么在创建另一个之前关闭一个,要么在你已经足够的时候放弃。


经过进一步思考,以上是错误的。我尝试过你的程序,它不会也不能做你说的,除非你遗漏了一些重要的故事。

  1. " cin"只是块。我按了几次,但没有任何有趣的事情发生。所以我把它拿出来了。
  2. 此程序不泄漏。每个线程在handle函数完成时终止。
  3. 这是我编写的代码,适应你的。

    #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),在创建时有一些选项可以自动释放内存,或者需要加入。您看到的一个线程是进程本身的“主要”线程。这样你的程序就会产生内存泄漏。