spin_lock是Linux内核的一种同步机制。内核代码可以通过获得spin_lock宣称对某一资源的占有,直到其释放该spin_lock;如果内核代码试图获得一个已经锁定的spin_lock,则这部分代码会一直忙等待,直到获得该spin_lock
1、定义和初始化spinlock
在linux中定义spinlock的方法很简单,和普通的变量定义一样。
spinlock_t spinlock;
初始化函数为spin_lock_init()。
2、锁定自旋锁
进入临界区之前,需要使用spin_lock宏定义来锁定自旋锁,spin_lock宏定义如下:
#define spin_unlock(lock) _spin_unlock(lock)
这个宏用来获得lock的自旋锁,如果能够立即获得自旋锁,则宏立即返回,否则,这个宏一直等待下去,直到lock被其他进程释放为止。(这地方和信号量不同,使用信号量时,进程不会原地打转,而是进入休眠状态)
3、释放自旋锁
推出临界区之前,需要使用spin_unlock来释放自旋锁。spin_unlock()宏代码如下:
#define spin_unlock(lock) _spin_unlock(lock)
这个宏用来释放lock的自旋锁,当调用该宏后,自旋锁立即释放。
4、使用自选锁
在驱动程序中,有些设备只允许打开一次,那么就需要一个自旋锁保护表示设备打开或者关闭的状态的一个变量OpenCloseStatus,此处的OpenCloseStatus为一个临界资源,如果不对OpenCloseStatus进行保护,当设备频繁的打开时,就有可能出现错误的OpenCloseStatus的状态,所以必须对OpencCloseStatus进行保护,其代码如下:
int OpenCloseStatus;
spinlock_t spinlock;
int xxxx_init(void)
{
............
spin_lock_init(&spinlock);
............
}
int xxxx_open(struct inode *inode, struct file *filp)
{
............
spin_lock(&spinlock);
if(OpenCloseStatus)
{
spin_unlock(&spinlock);
return -EBUSY;
}
OpenCloseStatus ++;
spin_unlock(&spinlock);
...........
}
int xxxx_release(struct inode *inode, struct file *filp)
{
............
spin_lock(&spinlock);
OpenCloseStatus --;
spin_unlock(&spinlock);
...........
}
阅读(1324) | 评论(0) | 转发(0) |