linux驱动之自旋锁(spinlock)

    自旋锁是类似于信号量的,同样是对设备的访问进行干预,自旋锁是一个互斥的,只能是上锁后设备不可用,解锁后可用。当某一个设备被自旋锁锁定时,其他的进程需要访问设备时会进入一个忙循环的等待状态,知道设备的自旋锁释放后方可对设备进行访问。

    在自旋锁锁住设备进行操作时,这些个操作一般都是比较简单,费时少,而且做到不要休眠,拥有自旋锁时禁止当前所用处理器上的CPU的中断。

 具体用法是

1.包含

Spinlock.h (include\linux)
2.初始化spinlock,当然你得先定义一个自旋锁, spinlock_t lock

#define spin_lock_init(_lock)				\
do {							\
	spinlock_check(_lock);				\
	raw_spin_lock_init(&(_lock)->rlock);		\
} while (0)
3.上锁 spin_lock_irqsave(lock, flags),其中flags是你定义的一个变量,这个函数会关闭当前处理器上(单核)所有的中断

#define spin_lock_irqsave(lock, flags)				\
do {								\
	raw_spin_lock_irqsave(spinlock_check(lock), flags);	\
} while (0)
4.解锁 spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)

static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
{
<span style="white-space:pre">	</span>raw_spin_unlock_irqrestore(&lock->rlock, flags);
}
这个是一般的用法, 当然在tasklet中,需要我们将 spin_lock_irqsave(lock, flags),替换成spin_unlock_bh(spinlock_t *lock),以及解锁用spin_unlock_bh(&gact->tcf_lock);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值