(一)核心鎖的使用之自旋鎖

小小小小小杰發表於2014-04-13

   對於鎖的使用,使用過的人會覺得比較簡單,但是沒有使用過的人來講,可能對其瞭解就比較淺了,平時開發過程中使用鎖及鎖中斷的時候較多,也積累了一些簡單的經驗給大家分享一下:

   首先我們先來討論一下自旋鎖,所謂自旋鎖,可以理解為就是原地打轉,直到獲取到對應的鎖才退出,核心中對應的介面是:spin_lock()和spin_unlock()

   使用場景:多個任務有可能對共享資源同時訪問,這個時候需要進行互斥操作,可以使用本組介面來實現互斥,但是本人強烈不建議使用此介面進行互斥(核心也不建議),原因是如果一個任務正在訪問臨界資源,使用了本組介面,但是在spin_lock後,spin_unlock前來了中斷,恰巧中斷上下文中也會呼叫spin_lock來獲取這個鎖,這個時候就抓瞎了,中斷上下文將永遠獲取不到那個鎖了,因為中斷優先順序較高,在任務未釋放鎖之前進入到了中斷上下文中,中斷上下文中spin_lock將永遠不會返回,從而死鎖;所以建議使用spin_lock_irqsave和spin_unlock_irqrestore這一對介面,下方表格列出了兩對自旋鎖方法,當然核心中還有其他方法,但是不常用,就不在這裡說明了。

   使用注意事項:鎖定時間一定要短,太長的話非常影響系統效能;還有就是自旋鎖是非遞迴的,也就是說在spin_lock_irqsave()之後不能再有spin_lock_irqsave的操作,實際開發中我也確實犯過這樣的低階錯誤。

 

自旋鎖方法

方法

描述

spin_lock()

獲取指定的自旋鎖

spin_unlock()

釋放指定的自旋鎖

spin_lock_irqsave()

獲取指定的自旋鎖,同時儲存本地中斷狀態,並禁止中斷

spin_unlock_irqrestore()

釋放指定的自旋鎖,同時恢復本地中斷狀態

 

 

 

 

 

 

 

 

 

 

相關文章