我想在多线程环境中实现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);
}
我只能为第一个块分配内存,然后是分段错误错误。我不知道我的错误在哪里,而且我对线程和锁定都很新,所以任何形式的帮助都会很棒!感谢。
答案 0 :(得分:2)
在这一行:
pthread_mutex_lock(&block->lock);
您尚未检查block
是否为NULL。你需要在循环中进行锁定。
更简单的是,为什么不为你的整个malloc只有一个互斥锁 - 让它在free_block_list_head
旁边静止,然后你可以在你的功能开始时将其锁定并在之后解锁。
如果坚持使用每块互斥锁,请记住为计算添加互斥锁的空间。您还需要确保传回的指针指向数据结构中的互斥锁之后的内存。
编辑:另请注意:您还没有在任何地方调用free_block_init
。