2012-01-29 120 views
0

我得到這個公式的末尾的free()的,因爲錯誤段錯誤...分割故障多線程

不要我必須釋放臨時變量* STCK?或者因爲它是一個本地指針,並且 從來沒有通過malloc分配一個內存空間,編譯器會爲我清理它?

void * push(void * _stck) 
{ 

    stack * stck = (stack*)_stck;//temp stack 
    int task_per_thread = 0; //number of push per thread 


    pthread_mutex_lock(stck->mutex); 
    while(stck->head == MAX_STACK -1) 
    { 
    pthread_cond_wait(stck->has_space,stck->mutex); 
    } 

    while(task_per_thread <= (MAX_STACK/MAX_THREADS)&& 
     (stck->head < MAX_STACK) && 
    (stck->item < MAX_STACK)//this is the amount of pushes 
       //we want to execute 
     ) 
    { //store actual value into stack 
    stck->list[stck->head]=stck->item+1; 
    stck->head = stck->head + 1; 
    stck->item = stck->item + 1; 
    task_per_thread = task_per_thread+1; 
    } 

    pthread_mutex_unlock(stck->mutex); 


    pthread_cond_signal(stck->has_element); 


    free(stck); 


    return NULL; 
} 

回答

0

編輯:你完全改變了這個問題,所以我的舊答案不再有意義了。我會嘗試回答新的問題(舊答案仍在下面),但僅供參考,下次請提出一個新問題,而不是更改舊問題。

stck是您設置爲指向與_stck指向相同的內存的指針。指針並不意味着分配內存,它只是指向已經(希望)分配的內存。當您例如

char* a = malloc(10); // Allocate memory and save the pointer in a. 
char* b = a;   // Just make b point to the same memory block too. 
free(a);    // Free the malloc'd memory block. 
free(b);    // Free the same memory block again. 

你釋放相同的內存兩次。

- 老答案

在推,你設置stck指向相同的內存塊。_stck,並在呼叫你免費堆棧的結束(從而在調用free()你每個線程共用一次)

刪除free()調用,至少對我來說,它不會崩潰了。在加入所有線程後,可能會在main()中釋放堆棧。

+0

你是對的....我的自由搞亂了我的運行時間......但我仍然有其他問題....我仍然得到錯誤後刪除免費() – user852415 2012-01-29 16:42:19

+0

@ user852415也回答了您的新問題..如果它對你有幫助,請標記爲已回答,並回答一個新問題,而不是再次更改。 – 2012-01-29 17:17:22