linux自旋锁使用时需要注意的几个地方

常常觉得需要写下来的东西,却往往由于没有及时写下来慢慢淡忘了。

写了一段时间内核代码,在不断修改错误的同时也多多少少积累了一点经验。暂且把使用自旋锁(spinlock)时需要注意的几个地方写下来。

1、在内核多线程编程时,为了保护共享资源通常需要使用锁,而使用的比较多的就是spinlock,但需要注意的是:所有临界区代码都需要加锁保护,否则就达不到保护效果。也就是,访问共享资源的多个线程需要协同工作共同加锁才能保证不出错。在实际写代码时,有时候会网掉这一点,以致出现各种稀奇古怪的问题,而且很难找到原因。

2、在出现两个和多个自旋锁的嵌套使用时,务必注意加锁和解锁的顺序。

比如:在线程1中,spinlock A  -> spinlock B -> spin unlock B -> spin unlock A ;那么,在需要同步的线程2中,若需要加相同的锁,则顺序也应该保持相同,spinlock A  -> spinlock B -> spin unlock B -> spin unlock A ;否则,很有可能出现死锁。

3、spinlock保护的代码执行时间要尽量短,若有for循环之类的代码,则一定要确保循环可以在短时间可以退出,从而使得spinlock可以释放。

4、spinlock所保护的代码在执行过程中不能睡眠。比如,在spinlock和spinunlock之间不能调用kmalloc, copy_from_user,kthread_stop等调用,因为这些函数调用均有可能导致线程睡眠。

5、spinlock在实际使用时有如下几种类型,spin_lock,spin_lock_bh,spin_lock_irqsave。在具体使用时,需要根据被保护临界区锁处的上下文选择合适的spinlock类型。

spin_lock用于不同cpu线程间同步,spin_lock_bh和spin_lock_irqsave主要用于本cpu线程间的同步,前者关软中断,后者关硬中断。

先写到这吧,由于个人水平有限,其中可能也有不太准确的地方,还有高人发现还望指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值