linux驱动之自旋锁(spinlock)

来源:互联网 发布:徐志雷ti7知乎 编辑:程序博客网 时间:2024/05/01 03:59

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

    在自旋锁锁住设备进行操作时,这些个操作一般都是比较简单,费时少,而且做到不要休眠,拥有自旋锁时禁止当前所用处理器上的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);


0 0
原创粉丝点击