自旋鎖應該是Linux內核中使用最多的鎖了,其它鎖不少都依賴自旋鎖實現。自旋鎖概念上簡單,一個自旋鎖是一個互斥設備,只能有2個值:"上鎖"和"解鎖"。它經常實現爲一個整數值中的一個單個位,想獲取一個特殊鎖的代碼測試相關的位,若是鎖是可用的,這個"上鎖"位被置位而且代碼繼續進入臨界區;相反,若是這個鎖已經被別人得到,代碼進入一個緊湊的循環中反覆檢查這個鎖,直到它變爲可用。這個循環就是自旋鎖的"自旋"部分。html
選擇自旋鎖,自旋等待的代價應該要儘量的小於線程調度的代價。即,使用自旋鎖的一個重要規則是自旋鎖必須一直是儘量短期的持有。這個很好理解,由於你持有的時間越長,其餘線程就不得不長時間自旋等待。同時持有線程不該被搶佔或睡眠,若是真發生了,其餘等待線程就悲劇了。linux
相關API,頭文件#include<linux/spinlock.h>
測試
void spin_lock_init(spinlock_t *lock); //初始化
void spin_lock(spinlock_t *lock); //加鎖
void spin_unlock(spinlock_t *lock); //釋放鎖
// ...... 其餘API這裏再也不列出 ......
複製代碼
spin_lock_init
——對應的邏輯能夠理解爲對標識位初始化;spin_lock
——對應的邏輯能夠理解爲,先嚐試加鎖(對標識位進行操做),若是成功則可持有臨界資源,若是嘗試加鎖失敗,就進入do-while
循環繼續嘗試加鎖(即,自旋),直到加鎖成功;spin_unlock
——對應的邏輯是將標識位置爲未加鎖狀態;Linux版本不一樣,對應的實現多是不一樣的,Linux-2.6.25版本後實現了先到先得功能,因此實現的代碼與以前版本是不一樣的,大體思路是相同的,只是標識位及判斷狀態的方法不一樣。spa
參考文檔:
帶您進入內核開發的大門 | 自旋鎖的使用
自旋鎖線程