(一)内核锁的使用之自旋锁

来源:互联网 发布:php flash 上传 编辑:程序博客网 时间:2024/05/20 23:04

   对于锁的使用,使用过的人会觉得比较简单,但是没有使用过的人来讲,可能对其了解就比较浅了,平时开发过程中使用锁及锁中断的时候较多,也积累了一些简单的经验给大家分享一下:

   首先我们先来讨论一下自旋锁,所谓自旋锁,可以理解为就是原地打转,直到获取到对应的锁才退出,内核中对应的接口是:spin_lock()和spin_unlock()

   使用场景:多个任务有可能对共享资源同时访问,这个时候需要进行互斥操作,可以使用本组接口来实现互斥,但是本人强烈不建议使用此接口进行互斥(内核也不建议),原因是如果一个任务正在访问临界资源,使用了本组接口,但是在spin_lock后,spin_unlock前来了中断,恰巧中断上下文中也会调用spin_lock来获取这个锁,这个时候就抓瞎了,中断上下文将永远获取不到那个锁了,因为中断优先级较高,在任务未释放锁之前进入到了中断上下文中,中断上下文中spin_lock将永远不会返回,从而死锁;所以建议使用spin_lock_irqsave和spin_unlock_irqrestore这一对接口,下方表格列出了两对自旋锁方法,当然内核中还有其他方法,但是不常用,就不在这里说明了。

   使用注意事项:锁定时间一定要短,太长的话非常影响系统性能;还有就是自旋锁是非递归的,也就是说在spin_lock_irqsave()之后不能再有spin_lock_irqsave的操作,实际开发中我也确实犯过这样的低级错误。

 

自旋锁方法

方法

描述

spin_lock()

获取指定的自旋锁

spin_unlock()

释放指定的自旋锁

spin_lock_irqsave()

获取指定的自旋锁,同时保存本地中断状态,并禁止中断

spin_unlock_irqrestore()

释放指定的自旋锁,同时恢复本地中断状态

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击