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);