Linux学习之系统编程篇:死锁的情形及其解决
(1)自己鎖自己(自己重復加同一個鎖)
解決:上鎖,自己操作完成后,一定要解鎖 lock 和 unlock 成對出現
舉例:
對于此處內核設計的思考:
鎖的類型 pthread_mutex_t 本質上是一個結構體。這個結構體中會有一個成員屬性(假設是flag),用于判斷是否上鎖,int型,其值是0或者1,1代表有一把鎖可用,意味著沒鎖,而0代表有鎖,當某線程執行到pthread_mutex_lock,內核會通過 flag 判斷是否上鎖,只要是上鎖狀態,所有線程都會被組設,因為在設計時候就決定了,它只關心是否上鎖,而不會關心是誰上的鎖,因此會出現自己鎖住自己的現象。
試想:在設計的時候,在結構體中,增加一個屬性,用于判斷是哪個線程上的鎖,執行到pthread_mutex_lock,先判斷是否上鎖,如果上鎖,再判斷是否是我上的鎖,這樣就將“普通鎖”變為“指紋鎖”,就可以避免自己鎖住自己的情況了。
(2)多個共享數據,多個鎖,某些情況下,可能會造成死鎖。
如上圖所示,就會造成“線程 1 阻塞在 B 鎖”和“線程 2 阻塞在 A 鎖”的現象。
解決:
方式 1:造成這總的死鎖的原因是線程訪問順序不一樣:
線程 1 :A->B ;
線程 2 :B->A
因此:讓線程按照一定的順序去訪問共享資源。
方式 2:在訪問其他鎖的時候,需要先將自己的鎖解開。
方式 3:使用 trylock。
總結
以上是生活随笔為你收集整理的Linux学习之系统编程篇:死锁的情形及其解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习之系统编程篇:互斥锁(pt
- 下一篇: Linux学习之系统编程篇:读写锁(pt