我使用Valgrind的Massif功能来检查我的C语言程序的内存使用情况,以调查内存使用情况。 我的代码中有很多动态分配,但根据 Massif 的说法,我发现它始终使用相同数量的内存。 经过进一步调查,我发现我的程序使用了两个线程,每个线程一致分配 64MB 堆内存。
根据附图可以观察到,最初创建两个线程时,它们使用了150.3MB的内存。当一个线程终止时,精确减少了 64MB,导致内存使用量为 86.3MB。
我不执行证明需要 64MB 堆内存的动态分配。这看起来完全是浪费
用C语言创建线程本质上会导致使用固定的64MB堆内存吗?有没有办法减少分配给线程的堆内存?
操作系统:Ubuntu 22.04
我尝试过调整堆栈大小,但自然没有效果。 我想减少分配给线程的 64MB 堆内存。
这是一个简单的示例,表明并不是创建 pthread 占用了所有空间。您的线程必须有自己的与其关联的内存分配。在这种情况下,如果可能的话,您可能需要重新设计您的程序以更有效地使用内存。
通过这个程序,我可以轻松创建 10,000 多个线程,甚至内存使用量不会增加 1GB。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
// gcc threadmemtest.c -o threadmemtest.bin -O3 -Wall -pthread -march=native
void* sleepforabit(void*arg) {
sleep(25);
return NULL;
}
int main(int argc, char **argv){
int i, numthreads = 5;
if (argc > 1) numthreads = atoi(argv[1]);
pthread_t *threadid = malloc(numthreads*sizeof(pthread_t));
for (i=0; i<numthreads; i++) {
pthread_create(&threadid[i], NULL, sleepforabit, NULL);
}
for (i=0; i<numthreads; i++) {
pthread_join(threadid[i], NULL);
}
free(threadid);
pthread_exit(0);
}