首页 理论教育 Linux驱动程序开发实例:使用自旋锁保护简单计数变量

Linux驱动程序开发实例:使用自旋锁保护简单计数变量

时间:2023-10-19 理论教育 版权反馈
【摘要】:spin_trylock函数尝试获得自旋锁lock,如果能立即获得锁,则返回真,否则立即返回假。中断安全的自旋锁函数如下:spin_lock_irq函数获得自旋锁的同时会禁止本地CPU上的中断与内核抢占。当自旋锁需要用于中断上下文时,必须使用spin_lock_irq函数。例3.1 自旋锁实例假设simple_count变量初始值为0,并期望该变量的值不大于1。在多CPU的情况和可抢占内核中,如下代码并不能保障simple_count不出现大于1的值:下面这个例子演示使用自旋锁保护simple_count变量的加操作,确保该设备不被多个用户同时打开。

Linux驱动程序开发实例:使用自旋锁保护简单计数变量

自旋的意思就是一直循环直到条件满足。自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元占有,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁。如果不能在很短的时间内获得锁,这无疑会导致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]#

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈