自旋锁只能被一个执行线程占有,如果另一个线程去获取一个已经占有的自旋锁,则该线程会进行忙等待,可以理解为C中的while(1){检查锁是否可用}
自旋锁的接口头文件为linux/spinlock.h 其实现在asm/spinlock.h
注意:Linux下实现的自旋锁是不可递归的.如果你获取一个自己占用的自旋锁,则会造成死锁.
自旋锁可以使用在中断中,中断中不可以使用信号量
在使用自旋锁之间应该禁止中断.可以设想你获取了一个自旋锁,然后中断发生,执行中断处理程序,此时中断处理程序获取你占用的自旋锁,中断处理必须忙等待.若中断不结束,你永远不会执行,所以不可能释放锁,所以死锁.
一个被争用的自旋锁使得请求他的线程在等待锁重新可用时自旋,这种行为是自旋锁的要点.所以自旋锁不应该被长期持有.
自旋锁用于多个CPU系统中,在单处理器系统中,自旋锁不起锁的作用,只是禁止或启用内核抢占。在自旋锁忙等待期间,内核抢占机制还是有效的,等待自旋锁释放的线程可能被更高优先级的线程抢占CPU。
针对自旋锁的操作
1.自旋锁的初始化
# define spin_lock_init(lock) \
do { *(lock) = SPIN_LOCK_UNLOCKED; } while (0)