線程死鎖

1. 什麼是死鎖

   死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象。

2. 死鎖要產生必須具備四個必要條件:

1.  互斥條件 
2.  請求和保持條件 
3.  不可剝奪條件  
4.  環路等待條件。

由於資源佔用是互斥的,當某個進程提出申請資源後,使得有關進程在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象死鎖。

3. 如何避免死鎖,常見的算法和原理

時刻檢查自己寫的程序有沒有在跳出時忘記釋放鎖。
如果自己的模塊可能重複使用一個鎖,建議使用嵌套鎖。
對於某些鎖代碼,不要臨時重新編寫,建議使用庫裏面的鎖,或者自己曾經編寫的鎖。
如果某項業務需要獲取多個鎖,必須保證鎖的按某種順序獲取,否則必定死鎖。
編寫簡單的測試用例,驗證有沒有死鎖。
編寫驗證死鎖的程序,從源頭避免死鎖。
int pthread_mutex_lock(pthread_mutex_t *mutex)\\將阻塞式加鎖

int pthread_mutex_trylock(pthread_mutex_t *mutex)\\換爲非阻塞式等待
兩個線程同時用兩個鎖時,兩邊使用的順序應該相同。不可交叉使用
//線程A:
    pthread_mutex_lock(&mutex_lock1) //加鎖mutex_lock1
    //代碼
    pthread_mutex_lock(&mutex_lock2) //加鎖mutex_lock2
    //代碼
    pthread_mutex_unlock(&mutex_lock1)//解鎖mutex_lock1
    //代碼
    pthread_mutex_unlock(&mutex_lock2)//解鎖mutex_lock2


//線程B:(應與線程A的順序相同)
    pthread_mutex_lock(&mutex_lock1) //加鎖mutex_lock1
    //代碼
    pthread_mutex_lock(&mutex_lock2) //加鎖mutex_lock2
    //代碼
    pthread_mutex_unlock(&mutex_lock1)//解鎖mutex_lock1
    //代碼
    pthread_mutex_unlock(&mutex_lock2)//解鎖mutex_lock2
//如果無法要爲所有的鎖定順序比較困難,就可以使用pthread_mutex_trylock函數替換pthread_mutex_lock以避免死鎖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章