自旋锁,就像名字一样,自旋。我们可以把自旋锁看作是一个变量,这个变量把临界区标记以下,如果进程正在运行去访问变量,另一个进程也想过去访问,那么因为有自旋锁的存在,另一个进程就要原地打转,等正在运行的运行结束再去访问。就像是一个陀螺一样,不停的打转,等着变量空闲再去访问。
自旋锁的内核接口
//初始化自旋锁,将自旋锁设置为1,表示有一个资源可用。
spin_lock_init(lock)
//尝试锁上自旋锁(置0),如果原来锁的值为1,返回1,否则返回0。
spin_trylock(lock)
//循环等待直到自旋锁解锁(置为1),然后,将自旋锁锁上(置为0)。
spin_lock(lock)
//将自旋锁解锁(置为1)。
spin_unlock(lock)
自旋锁的使用实例,使设备只能让一个进程打开
int x_count=0;//定义文件的打开次数
spin_lock_t lock;//定义一个自旋锁
int x_init(void)
{
............
spin_lock_init(&lock);
............
return 0;
}
static int led_open(...............)
{
....
//获取自旋锁
spin_lock(&lock);
if(x_count)
{
/*已经打开了*/
//将自旋锁解锁(置为1)。
spin_unlock(lock);
//直接返回
return -EBUSY;
}
x_count++;//如果打开了自加1
//将自旋锁解锁(置为1)。
spin_unlock(lock);
.......
return 0;
}
static int led_release(..............)
{
.........
//循环等待直到自旋锁解锁(置为1),然后,将自旋锁锁上(置为0)。
spin_lock(&lock)
x_count--;
//将自旋锁解锁(置为1)。
spin_unlock(&lock)
}