2011-10-02 116 views
-2

我開發了一個用戶級線程庫。在代碼中,有時會發生死鎖,但我無法弄清楚它爲什麼會發生。這裏是互斥鎖和開鎖功能的代碼:在互斥代碼中發生死鎖

int gtthread_mutex_lock(gtthread_mutex_t *mutex) 
{ 
    if(!mutex) //checks if mutex is null 
     return -1; 
    while(mutex->available==1); //spin locks if mutex is already locked by someone else 
    __sync_val_compare_and_swap(&mutex->available,0,1); //atomic function to swap value 0 with 1 
    mutex->owner=node->th; 
    return 0; 
} 

int gtthread_mutex_unlock(gtthread_mutex_t *mutex) 
{ 
    if(!mutex) return -1; 

    if(mutex->available) 
    { 
     mutex->available=0; 
     mutex->owner=NULL; 
    } 
    return 0; 
} 
+2

這是作業:http://www.cc.gatech.edu/classes/AY2005/cs6210_fall/Project1writeup.html – jman

+0

是的,這是一個項目。我不是要求代碼。我只是要求一個互斥體不會工作的情況。 :) – CuriousCoder

回答

1

另一個線程可能會獲得您的while測試和交換之間的鎖定。

你必須檢查__sync_val_compare_and_swap的回報,並重申它是否沒有成功。

此外,您的用於跟蹤所有者的代碼將不起作用,因爲在解鎖時,您可能會刪除某些其他線程編寫的信息。

更好的是你只有一個字段(處理原子操作),它擁有所有者的信息,如果沒有的話是0。