2014-10-04 115 views
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); 
} 

我只能夠分配的內存的第一個塊,然後分段錯誤。我不知道我的錯誤是,我很新的線程和鎖,所以任何形式的幫助將是巨大的!謝謝。

+0

所以...如果你刪除了多線程位,並做分配/釋放它工作正常單線程?或不? – HostileFork 2014-10-04 21:24:33

+0

是的。我真的不知道如何添加鎖以使其工作。 – user3291818 2014-10-04 21:30:33

+0

我沒看過代碼,只是問...因爲你要麼有兩個問題之一;你有哪個問題應該引導你的問題。如果這是一個malloc實現問題,爲什麼要將互斥體引入它?如果這是一個互斥問題,爲什麼我們不得不閱讀一堆你知道要工作的malloc代碼...而不是更簡單的來展示這一點?想想做一個[「最小化,正確,可驗證的例子」](http://stackoverflow.com/help/mcve)意味着什麼。有些人願意將StackOverflow變成「我們調試你的代碼」服務,但我喜歡幫助人們自助。 – HostileFork 2014-10-04 21:38:01

回答

2

在這一行:

pthread_mutex_lock(&block->lock); 

你沒有檢查尚未block是否爲NULL。你需要在循環中進行鎖定。

更簡單一點,爲什麼你的整個malloc只有一個互斥體 - 使它成爲free_block_list_head旁邊的一個靜態互斥體,然後你可以在函數啓動時將其鎖定,然後解鎖它。

如果你堅持使用每塊的互斥體,記得要互斥體,以你的計算添加空間。您還需要確保您傳回的指針在數據結構中的互斥之後指向memeory。

編輯:另外請注意:你也沒有叫free_block_init任何地方。