自旋锁的原理及使用
什么是自旋鎖
是指當一個線程在獲取鎖的時候,如果鎖已經被其它線程獲取,那么該線程將循環等待,然后不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出循環。
獲取鎖的線程一直處于活躍狀態,但是并沒有執行任何有效的任務,使用這種鎖會造成busy-waiting。
它是為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有一個保持者,也就說,在任何時刻最多只能有一個執行單元獲得鎖。但是兩者在調度機制上略有不同。對于互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起調用者睡眠,如果自旋鎖已經被別的執行單元保持,調用者就一直循環在那里看是否該自旋鎖的保持者已經釋放了鎖,”自旋”一詞就是因此而得名。
自旋鎖存在的問題
自旋鎖的優點
linux內核提供了位和整形變量的原子操作函數,這些函數的實現也是以來cpu的原子操作,與cpu底層架構有關。就arm處理器而言,底層的實現細節主要通過匯編指令ldrex和strex來完成。原子操作可以保證對位和整形數據的操作是排他性的,所以為臨界區代碼的互斥訪問奠定了基礎。自旋鎖就是通過執行一個原子操作,測試并設置某個內存變量,由于它是原子操作,所以對該變量的訪問是排他性的,如何測試到鎖為空閑,則獲取該自旋鎖,否則重復執行該原子操作,直至該鎖可用為止。
總結
- 上一篇: DSP28335入门教程:ADC的使用
- 下一篇: C的指针疑惑:C和指针17(经典抽象数据