C/ c++线程调用填充内存
C/C++ thread calling filling up memory
我试图使一个服务器(多线程),我遇到了一个问题:它正在填补内存。所以我决定做一个简单的测试。下面是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。
假设你不希望线程的数量不断增加,你应该在创建一个线程之前关闭一个线程,或者至少在你有足够的线程时放弃。
进一步思考,以上是错误的。我试过你的程序,它不会也不能做你说的,除非你遗漏了一些重要的部分。
- 带"cin"的那一行只是阻塞。我按了几次回车键,但没有什么有趣的事情发生。所以我把它去掉了。
- 此程序不泄漏。当
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),在创建时有自动释放内存的选项,否则需要加入。您看到的一个线程是进程本身的"主"线程。这样你的程序就会产生内存泄漏。
- 将字符串存储在c++中的稳定内存中
- 在c++中用vector填充一个简单的动态数组
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 内存集不会填充整个指针数组 c++
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 结构/类是否以某种方式影响内存填充
- 写入 int 与 uint16_t 时的内存填充
- 根 - 填充失败分支:内存驻留树
- 是一个哨兵 QWidget 一个好主意(以防止在创建和填充布局时出现内存泄漏)
- 填充 2D 动态数组时"无法读取内存"
- std::bitset 是否保证连续内存以及结构中的恒定大小(以避免填充?
- 为什么这个字符数组包含未填充的内存
- C++编译器内存填充:对象是否应该具有相同的大小
- 稀疏矩阵的填充非常慢,在本征中没有内存增益
- 使用__declspec的内存填充问题
- [C++]在此代码之前不存在的析构函数中引发的内存错误。尝试创建一个新的动态数组并填充它
- 内存填充问题
- 使用内存变量初始化填充位结构体
- C/ c++线程调用填充内存
- Cython:让python创建要用C++填充的内存