自旋锁

以下是我学习自旋锁的一些体会,如果能对您有些帮助,不胜荣耀;如果有哪些错误或不足,请私信我,我会及时进行修改!!!
在看自旋锁之前,我们要先明白一点:加锁,保护的是数据,而不是代码
1.什么是自旋锁(spin_lock)?
自旋锁实际上就是一个结构体变量,它用来保护共享资源,避免不同进程或线程并发的进行访问该共享区数据,它在SMP(多处理器)和可抢占式单处理器使用才会有效果;
typedef struct
{
volatile unsigned long lock; //该字段表示自旋锁的状态,’1’表示未加锁,’0’或其他负数表示已经加锁
#ifdef CONFIG_DEBUG_SPINLOCK //该字段是在调试自旋锁的时候,才会用到,这里我暂且不去讨论
volatile unsigned long owner_pc;
volatile unsigned long owner_cpu;
#endif
} spinlock_t;
注:在<深入理解Linux内核>中该结构体还有一个break_lock字段,但是在我在linux2.6版的内核代码中并没有发现该字段;
2.自旋锁是怎么保护数据的?
假设现在有p1,p2两个进程试图访问同一临界区,我们现在给p1加上自旋锁,并且让p1进行访问,同样我们也给p2加上自旋锁,当p1正在访问临界区的时候,p2在外面需要获得这个锁,才能进入临界区,做操作.这是p2就要在周围’旋转’,处于一个非常紧凑的循环之中,不断的尝试去获得这把锁,但是只有当p1释放了该锁的时候,p2才可以进入临界区;

3.自旋锁在什么时候可以使用?
因为自旋锁在被争用的时候,一些请求该锁的线程就会处于忙等待状态(就是处于循环之中,不断去尝试获得锁),这种状态是比较浪费处理器时间的;所以自旋锁只能在(加锁-解锁)时间间隔短的时候使用;如果需要让线程休眠以让处理器有时间去处理其他事情的时候,我们可以使用信号量;

4.自旋锁方法
在单处理器上,自旋锁的功能是不存在的,这是它是内核抢占机制的开关!!!如果禁止内核抢占,那么自旋锁在编译的时候,会被完全剔除出内核,这时自旋锁不会起任何作用;
简单的说一下函数的使用:
在2.6.23版本中,没有了spin_lock函数,只有pthread_spin_lock() //该函数和spin_lock的功能相同
自旋锁的使用
1.初始化锁 pthread_spin_init()
2.加锁 pthread_spin_lock()
/临界区/
3.解锁 pthread_spin_unlock()
在使用完之后,记得要将自旋锁删除,pthread_spin_destroy()

5.在使用自旋锁的时候需要注意哪些方面?
a.自旋锁不能递归
原因:在递归的时候,如果在递归的过程中,需要重新获得一把已经被持有的自旋锁,那么你就会一直在等待这个锁被释放,才可以继续往下走,但是因为是递归需要返回才能继续执行上一次调用自身函数的地方,假设释放锁的操作,在返回之后,那么就会造成死锁.
b.在获取自旋锁的时候,一定要禁止本地中断的发生
原因:假如一个自旋锁已经被持有了,这时候来了个中断,又要去获得这把锁,中断处理程序就会在这里旋转,但是释放锁的程序在中断处理程序执行完之前,是不会执行的,so~~~双重请求产生死锁; 但是如果是在多处理器上面的话,中断和该锁的持有者不在同一个处理器上,那么即使中断处理程序要去获得该锁,也并不会产生死锁.
c.还要注意自旋锁与下半部的共同使用
下半部会抢占进程上下文,所以在下半部和进程上下文的共享数据的时候,要对进程上下文的数据进行保护,同时还要禁止下半部的发生;中断处理程序会抢占下半部,所以当下半部和中断处理程序共享数据的时候,要对下半部的数据进行保护,同时要禁止本地中断;
但是下半部之间共享数据是没问题的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值