Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 每线程内存分配_C_Memory Management_Pthreads - Fatal编程技术网

C 每线程内存分配

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方法,它不返回释放的内存量 不要考虑我的

我正在为多线程应用程序开发一个跟踪工具,尤其是关于内存分配的

我想要每个线程的内存分配。我知道当线程执行malloc时,使用的内存是全局堆。我想跟踪哪个线程分配了多少内存

我在malloc上做了一个包装,每次有malloc时都会增加值,如下所示:

void *mymalloc(size_t size) {
    mem_used[thread_id] += size;
    return malloc(size);
}
它工作得很好。问题在于
free
方法,它不返回释放的内存量

不要考虑我的解决方案,这只是为了展示我的努力

编辑:


如上所述,保留我自己的表是一种过于繁重的方法。

它有点复杂。不经意间:

  • 使用指针值和为该指针分配的内存大小创建一个映射
  • my\u malloc
    中,使用
    size
    参数更新映射
  • free
    编写自己的包装,减去该线程的
    大小(通过查找指针值检索)

将mymalloc更改为:

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(当然)
  • 指针
  • 分配大小
然后,您必须使用自己的mallocfree函数来执行实际的mallocing和free操作,但也要保持分配表的更新


这是为了调试吗?否则,维护此表的开销可能会很大。

您分配了一个内存区域并返回了“已分配区域地址”+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);
}