2
實現的malloc我想要實現在多線程環境中的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);
}
我只能夠分配的內存的第一個塊,然後分段錯誤。我不知道我的錯誤是,我很新的線程和鎖,所以任何形式的幫助將是巨大的!謝謝。
所以...如果你刪除了多線程位,並做分配/釋放它工作正常單線程?或不? – HostileFork 2014-10-04 21:24:33
是的。我真的不知道如何添加鎖以使其工作。 – user3291818 2014-10-04 21:30:33
我沒看過代碼,只是問...因爲你要麼有兩個問題之一;你有哪個問題應該引導你的問題。如果這是一個malloc實現問題,爲什麼要將互斥體引入它?如果這是一個互斥問題,爲什麼我們不得不閱讀一堆你知道要工作的malloc代碼...而不是更簡單的來展示這一點?想想做一個[「最小化,正確,可驗證的例子」](http://stackoverflow.com/help/mcve)意味着什麼。有些人願意將StackOverflow變成「我們調試你的代碼」服務,但我喜歡幫助人們自助。 – HostileFork 2014-10-04 21:38:01