C 每线程内存分配
我正在为多线程应用程序开发一个跟踪工具,尤其是关于内存分配的 我想要每个线程的内存分配。我知道当线程执行malloc时,使用的内存是全局堆。我想跟踪哪个线程分配了多少内存 我在malloc上做了一个包装,每次有malloc时都会增加值,如下所示:C 每线程内存分配,c,memory-management,pthreads,C,Memory Management,Pthreads,我正在为多线程应用程序开发一个跟踪工具,尤其是关于内存分配的 我想要每个线程的内存分配。我知道当线程执行malloc时,使用的内存是全局堆。我想跟踪哪个线程分配了多少内存 我在malloc上做了一个包装,每次有malloc时都会增加值,如下所示: void *mymalloc(size_t size) { mem_used[thread_id] += size; return malloc(size); } 它工作得很好。问题在于free方法,它不返回释放的内存量 不要考虑我的
void *mymalloc(size_t size) {
mem_used[thread_id] += size;
return malloc(size);
}
它工作得很好。问题在于free
方法,它不返回释放的内存量
不要考虑我的解决方案,这只是为了展示我的努力
编辑:
如上所述,保留我自己的表是一种过于繁重的方法。它有点复杂。不经意间:
- 使用指针值和为该指针分配的内存大小创建一个映射李>
- 在
中,使用my\u malloc
参数更新映射size
- 为
编写自己的包装,减去该线程的free
大小(通过查找指针值检索)
int* mymem = malloc(size + sizeof(int)*2);
mymem[0] = thread_id;
mymem[1] = size;
mem_used[thread_id] += size;
return &mymem[2].
然后,在myfree(void*mem)中,您:
这是可以优化的,但我希望你得到的想法 我唯一能想到的(尽管您可能考虑过这一点)是保留一个包含以下列的分配表:
- ThreadID(当然)
- 指针
- 分配大小
这是为了调试吗?否则,维护此表的开销可能会很大。您分配了一个内存区域并返回了“已分配区域地址”+2*sizeof(int),因此在myfree()中,您应该传递给free()的地址是“mymalloc()返回的地址”—2*sizeof(int),这是“imem”。这是一个不错的解决方案,我喜欢!谢谢
void myfree(void* mem)
{
int* imem = (int*)(mem - sizeof(int)*2);
int thread_id = imem[0];
int size = imem[1];
mem_used[thread_id] -= size;
free(imem);
}