日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自旋锁的原理及使用

發布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自旋锁的原理及使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是自旋鎖

是指當一個線程在獲取鎖的時候,如果鎖已經被其它線程獲取,那么該線程將循環等待,然后不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出循環。

獲取鎖的線程一直處于活躍狀態,但是并沒有執行任何有效的任務,使用這種鎖會造成busy-waiting。

它是為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有一個保持者,也就說,在任何時刻最多只能有一個執行單元獲得鎖。但是兩者在調度機制上略有不同。對于互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起調用者睡眠,如果自旋鎖已經被別的執行單元保持,調用者就一直循環在那里看是否該自旋鎖的保持者已經釋放了鎖,”自旋”一詞就是因此而得名。

自旋鎖存在的問題

  • 如果某個線程持有鎖的時間過長,就會導致其它等待獲取鎖的線程進入循環等待,消耗CPU。使用不當會造成CPU使用率極高。
  • 上面Java實現的自旋鎖不是公平的,即無法滿足等待時間最長的線程優先獲取鎖。不公平的鎖就會存在“線程饑餓”問題。
  • 自旋鎖的優點

  • 自旋鎖不會使線程狀態發生切換,一直處于用戶態,即線程一直都是active的;不會使線程進入阻塞狀態,減少了不必要的上下文切換,執行速度快
  • 非自旋鎖在獲取不到鎖的時候會進入阻塞狀態,從而進入內核態,當獲取到鎖的時候需要從內核態恢復,需要線程上下文切換。 (線程被阻塞后便進入內核(Linux)調度狀態,這個會導致系統在用戶態與內核態之間來回切換,嚴重影響鎖的性能)
  • linux內核提供了位和整形變量的原子操作函數,這些函數的實現也是以來cpu的原子操作,與cpu底層架構有關。就arm處理器而言,底層的實現細節主要通過匯編指令ldrex和strex來完成。原子操作可以保證對位和整形數據的操作是排他性的,所以為臨界區代碼的互斥訪問奠定了基礎。自旋鎖就是通過執行一個原子操作,測試并設置某個內存變量,由于它是原子操作,所以對該變量的訪問是排他性的,如何測試到鎖為空閑,則獲取該自旋鎖,否則重復執行該原子操作,直至該鎖可用為止。

    總結

    以上是生活随笔為你收集整理的自旋锁的原理及使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。