C语言有没有办法减少线程的堆大小?

问题描述 投票:0回答:1

massif diagram

我使用Valgrind的Massif功能来检查我的C语言程序的内存使用情况,以调查内存使用情况。 我的代码中有很多动态分配,但根据 Massif 的说法,我发现它始终使用相同数量的内存。 经过进一步调查,我发现我的程序使用了两个线程,每个线程一致分配 64MB 堆内存。

根据附图可以观察到,最初创建两个线程时,它们使用了150.3MB的内存。当一个线程终止时,精确减少了 64MB,导致内存使用量为 86.3MB。

我不执行证明需要 64MB 堆内存的动态分配。这看起来完全是浪费

用C语言创建线程本质上会导致使用固定的64MB堆内存吗?有没有办法减少分配给线程的堆内存?

操作系统:Ubuntu 22.04

我尝试过调整堆栈大小,但自然没有效果。 我想减少分配给线程的 64MB 堆内存。

c pthreads heap-memory
1个回答
0
投票

这是一个简单的示例,表明并不是创建 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.