自旋的意思就是一直循环直到条件满足。自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元占有,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁。如果不能在很短的时间内获得锁,这无疑会导致CPU效率降低。
ARM体系下的自旋锁相关的结构如下:
与自旋锁相关的函数主要包括以下几个:
spin_lock_init(lock);//初始化自旋锁
spin_lock(lock);//获得自旋锁
spin_trylock(lock);//尝试获得自旋锁
spin_unlock(lock);//释放自旋锁
spin_lock函数在获得锁后将立即返回,否则在原地等待,直到获得锁。spin_trylock函数尝试获得自旋锁lock,如果能立即获得锁,则返回真,否则立即返回假。
中断安全的自旋锁函数如下:
spin_lock_irq函数获得自旋锁的同时会禁止本地CPU上的中断与内核抢占。当自旋锁需要用于中断上下文时,必须使用spin_lock_irq函数。spin_lock_irq与spin_unlock_irq成对使用,spin_lock_irqsave与spin_unlock_irqsave成对使用。spin_lock_irqsave函数会保存本地中断的状态,在解锁时需用spin_unlock_irqrestore函数恢复中断的状态。
例3.1 自旋锁实例
假设simple_count变量初始值为0,并期望该变量的值不大于1。在多CPU的情况和可抢占内核中,如下代码并不能保障simple_count不出现大于1的值:
下面这个例子演示使用自旋锁保护simple_count变量的加操作,确保该设备不被多个用户同时打开。代码见\samples\3synchronous\3-1spinlock。
设备打开与关闭函数代码如下:(www.xing528.com)
应用层参考代码如下:
本例运行结果如下:
[root@urbetter drivers]#insmod spinlock.ko
chardev register success
[root@urbetter drivers]#mknod/dev/fgj c 2240
[root@urbetter drivers]#./test&
[root@urbetter drivers]#open/dev/fgj successfully
再次打开会失败
[root@urbetter drivers]#./test
error open
:Device or resource busy
[root@urbetter drivers]#
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。