Linux 裝置驅動 併發 之 自旋鎖

2021-06-12 23:06:41 字數 896 閱讀 3984

自旋鎖最多只能被乙個可執行單元持有,自旋鎖不會引起呼叫者睡眠,

如果乙個執行執行緒試圖獲得乙個已經被持有的自旋鎖,那麼執行緒就會一直進行忙碌環,一直等待下去,

在那裡看是否該自旋鎖的保持者已經釋放了鎖,「 自旋 」 就是這個意思.

spin_lock_init ( x )

該巨集用於 初始化自旋鎖 x,自旋鎖在使用前必須先初始化.

spin_lock ( lock )

獲取自旋鎖 lock ,如果成功,立即獲得鎖,並馬上返回,否則它將一直自旋在那裡,直到該自旋鎖的

保持者釋放.

spin_trylock ( lock )

試圖獲取自旋鎖 lock ,如果能立即獲得鎖,並返回真,

否則立即返回假, 它不會一直等待被釋放.

spin_unlock ( lock )

釋放自旋鎖 lock ,它與 spin_trylock 或 spin_lock 配對使用.

訊號量是睡眠鎖,自旋鎖是忙等鎖.

1,訊號量可能允許多個持有者,而自旋鎖在任何時候只能允許乙個持有者.

當然也有訊號量叫互斥訊號量 ( 只能有乙個持有者 ),允許有多個持有者的訊號量計數訊號量.

2,訊號量適合於保持時間長的情況;而自旋鎖適合於保持時間非常短的情況.

在實際應用中,自旋鎖控制的**只有幾行,而持有自旋鎖的時間也一般不會超過兩次上下文

切換的時間,因為執行緒一旦要進行切換,就至少花費切出切入兩次,自旋鎖的占用時間如果遠

遠長於兩次上下文切換 ,我們就應該選擇訊號量.

C 併發程式設計 自旋鎖

自旋鎖是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出迴圈。include pch.h include include include include using namespace std class sp...

linux驅動之 訊號量 自旋鎖 互斥體

0 原子操作 原子操作就是單位操作,也就是說操作過程不能被中斷 下面 中每條語句看起來是原子操作,其實不是原子操作 int main 0 這兩條c語句度不是原子操作,某條彙編語句可能會被其他程序或者執行緒打斷 使對整形資料 int 操作變成原子操作,要依靠乙個資料型別 atomic t atomic...

字元裝置驅動第八課 自旋鎖

原始碼目錄下include linux spinlock.hstatic spinlock t lock 定義乙個自旋鎖spin lock init lock spin lock lock spin unlock lock include include include include includ...