C/ c++线程调用填充内存

C/C++ thread calling filling up memory

本文关键字:填充 内存 调用 线程 c++      更新时间:2023-10-16

我试图使一个服务器(多线程),我遇到了一个问题:它正在填补内存。所以我决定做一个简单的测试。下面是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: %dn", GetLastError());
    }
}
}

下面是'handle'函数:

void handle(void *)
{
    ;
}

我打开任务管理器,我正在查看我的进程占用了多少RAM。如果函数main就像您现在看到的那样,在每次按1键然后按enter键之后(这样while中的东西就会执行),进程占用的RAM就会增加4k(基本上,每次创建线程或类似的东西时,它都会泄漏4k的内存)。如果我多次这样做,它会一直增加,每次增加4k。

如果在main函数中我注释了这个'thread = _beginthread(handle, 0,0);'并取消注释'//handle(NULL);',那么进程将不会增加它的RAM内存。

有谁知道如何释放那4k内存吗?

我正在用代码块编译它,但同样的结果是用visual studio编译它。

编辑:from MSDN: "当线程从那个例程返回时,它被自动终止。"我也把'_endthread();'在我的句柄函数,但结果是一样的!

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

我想你已经证明了创建一个线程的内存成本大约是4K。

假设你不希望线程的数量不断增加,你应该在创建一个线程之前关闭一个线程,或者至少在你有足够的线程时放弃。


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

  1. 带"cin"的那一行只是阻塞。我按了几次回车键,但没有什么有趣的事情发生。所以我把它去掉了。
  2. 此程序不泄漏。当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: %dn", GetLastError());
      break;
    }
  }
}

它运行50,000次迭代,总共使用不到1MB的内存。完全符合预期

有些地方不太对劲

每个线程都需要一些内存用于它自己的基础设施,这就是4K。当线程终止时(这取决于您的实现),这4K将被释放。您应该使用API函数来连接子线程,因此您应该保留句柄。直接调用句柄函数只是一个函数调用,在这种情况下不分配内存。

编辑:

你的"handle"函数立即终止。据我所知(至少对于posix/linux),在创建时有自动释放内存的选项,否则需要加入。您看到的一个线程是进程本身的"主"线程。这样你的程序就会产生内存泄漏。