massif diagram

我使用Valgrind的Massif特性来判断我的C语言程序的内存使用情况,以调查内存使用情况. 我的代码中有许多动态分配,但根据Massif的说法,我发现它始终使用相同数量的内存. 进一步研究后,我发现我的程序使用两个线程,每个线程一致地分配64MB的堆内存.

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

我不会执行需要64MB堆内存的动态分配.这似乎完全是一种浪费

在C语言中创建线程是否必然会导致使用固定的64MB堆内存?有没有办法减少分配给线程的堆内存?

操作系统:Ubuntu 22.04

我试着调整堆栈大小,但自然无效. 我想减少分配给线程的64MB堆内存.

推荐答案

这里有一个简单的示例来说明,占用所有空间的并不是p线程的创建.您的线程必须有自己的内存分配与之关联.在这种情况下,如果可能的话,您可能需要重新设计您的程序以更有效地使用内存.

使用这个程序,我可以轻松地创建10,000多个线程,而内存使用量甚至不会增加1 GB.

#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++) {
    if (pthread_create(&threadid[i], NULL, sleepforabit, NULL) != 0) {
      fprintf(stderr, "Error creating pthread[%i].\n", i);
      numthreads = i;
      break;
    }
  }
  for (i=0; i<numthreads; i++) {
    pthread_join(threadid[i], NULL);
  }
  free(threadid);
  pthread_exit(0);
}

C++相关问答推荐

Bison解析器转移/减少冲突

CC crate 示例不会与C函数链接

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

为什么静态说明符为内联函数生成外部定义?

ATmega328P USART发送字符重复打印

增加getaddrinfo返回的IP地址数量

为什么I2C会发送错误的数据?

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

文件权限为0666,但即使以超级用户身份也无法打开

GDB输出ARM助记符

在for循环中指向数组开头之前

添加函数会 destruct 嵌入式C代码(无IDE)

在C中创建任意类型的只读指针参数

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

在C++中允许使用字符作为宏参数

从不兼容的指针类型返回&&警告,但我看不出原因

即使我在C++中空闲,也肯定会丢失内存

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起

inline 关键字导致 Clion 中的链接器错误