Reference:
spin_lock_bh()與spin_unlock_bh()
Linux核心自旋鎖
Linux自旋鎖
Spinlock – Wikipedia, the free encyclopedia
本文地址:https://segmentfault.com/a/1190000005354100
原理
首先,spinlock是一把鎖,它的功能與其他鎖的作用類似,都是對用於臨界區進行原子讀寫。使用這把鎖時,原理上就是不停的迴圈檢查鎖的狀態,直到可用的時候進入臨界區。
與mutex的區別
Spinlock只進行虛幻檢查,在核心中仍然允許搶佔。
Mutex會立即引起排程,因而在一些中斷處理函式中會出問題。
注意:
由於是迴圈檢查而已,因此臨界區的大小應該限制,否則非常影響效率。
選擇自旋鎖時,要注意考慮中斷(軟中斷與硬中斷;timer中斷屬於軟中斷)
函式和巨集定義
標頭檔案
#include <linux/spinlock.h>
靜態初始化
spinlock_t a_lock = SPIN_LOCK_UNLOCKED;
巨集定義和函式
動態初始化:
spin_lock_init(&a_lock);
判斷自旋鎖是否上鎖:
spin_is_locked(&a_lock);
等待直到spinlock解鎖
spin_unlock_wait(&a_lock);
進入和退出臨界區
spin_lock(&a_lock);
spin_unlock(&a_lock);
儲存狀態暫存器值地進入和退出臨界區
int flags;
spin_lock_irqsave(&a_lock, flags);
spin_unlock_irqrestore(&a_lock, flags);
遮蔽硬體中斷地進入和退出臨界區
spin_lock_irq(&a_lock);
spin_unlock_irq(&a_lock);
遮蔽底半部中斷地進入和退出臨界區
spin_lock_bh(&a_lock);
spin_unlock_bh(&a_lock);