【问题标题】:Implementing malloc in multithreaded environment在多线程环境中实现malloc
【发布时间】:2014-11-29 14:17:54
【问题描述】:

我想在多线程环境下实现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);
}

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

【问题讨论】:

  • 所以...如果您删除多线程位,并在单个线程上执行分配/释放它工作正常吗?还是不行?
  • 是的。我真的不知道如何以及在何处添加锁以使其工作。
  • 我没有阅读代码,只是在问......因为你要么有两个问题之一;以及您遇到的问题应该指导您的问题。如果是 malloc 实现问题,为什么要引入互斥锁?如果这是一个互斥锁问题,为什么我们必须阅读一堆你知道可以工作的 malloc 代码......而不是更简单的东西来证明这一点?想想制作"Minimal, Correct, Verifiable Example" 意味着什么。有些人愿意将 StackOverflow 变成“我们调试您的代码”服务,但我更喜欢帮助人们自助。

标签: c multithreading malloc mutex free


【解决方案1】:

在这一行:

pthread_mutex_lock(&block->lock);

您尚未检查 block 是否为 NULL。您需要在循环内进行锁定。

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

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

编辑:另请注意:您也没有在任何地方打电话给free_block_init

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多