c - 多线程环境下malloc的实现

标签 c multithreading malloc mutex free

我想在多线程环境下实现malloc,我从here获取了代码.

添加互斥体后:

typedef struct free_block {
    size_t size;
    struct free_block* next;
    pthread_mutex_t lock;
} free_block;

void free_block_init(free_block *FB){
    pthread_mutex_init(&FB->lock, NULL);
}

static free_block free_block_list_head = { 0, 0 };
static const size_t overhead = sizeof(size_t);
static const size_t align_to = 8;

void* mymalloc(unsigned int size) {
    size = (size + sizeof(size_t) + (align_to - 1)) & ~ (align_to - 1);
    free_block* block = free_block_list_head.next;
    pthread_mutex_lock(&block->lock);
    free_block** head = &(free_block_list_head.next);
    while (block != 0) {
        if (block->size >= size) {
            *head = block->next;
            pthread_mutex_unlock(&block->lock);
            return ((char*)block) + sizeof(size_t);
        }
        head = &(block->next);
        block = block->next;
    }
    block = (free_block*)sbrk(size);
    block->size = size;
    pthread_mutex_unlock(&block->lock);
    return ((char*)block) + sizeof(size_t);
}

unsigned int myfree(void* ptr) {
    free_block* block = (free_block*)(((char*)ptr) - sizeof(size_t));
    pthread_mutex_lock(&block->lock);
    block->next = free_block_list_head.next;
    free_block_list_head.next = block;
    pthread_mutex_unlock(&block->lock);
}

我只能将内存分配给第一个 block ,然后出现段错误错误。我不知道我的错误在哪里,而且我对线程和锁非常陌生,所以任何形式的帮助都会很棒!谢谢。

最佳答案

在这一行中:

pthread_mutex_lock(&block->lock);

您还没有检查block是否为NULL。您需要在循环内进行锁定。

更简单的是,为什么不为整个 malloc 只使用一个互斥体 - 将其设置为 free_block_list_head 旁边的静态,然后您可以在函数开始时锁定它并在之后解锁它。

如果您确实坚持使用每 block 互斥体,请记住在计算中为互斥体添加空间。您还需要确保传回的指针指向数据结构中互斥体之后的内存。

编辑:另请注意:您还没有在任何地方调用 free_block_init

关于c - 多线程环境下malloc的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26197307/

相关文章:

C-测量函数调用的读写次数

c++ - 使用 CMake 为 MonoDevelop 生成项目文件

C 程序有时会出现段错误

c - C 编译器是否修复了一些明显的内存泄漏?

c - 我的代码有什么问题(CS50 2012 Pset 1 贪婪)

c - srand()——为什么只调用一次?

c++ - `clock()` 给出通常的时钟而不是 CPU 时钟

python - if 语句范围内的 C++ 宏未编译

multithreading - 如何创建可在 Rust 多线程服务器中使用的结构?

c - Windows触发了一个断点——C语言