自旋锁

  自旋锁最多只能被一个可执行线程持有。如果一个执行线程试图获得一个被已经持有(即争用)的自旋锁,那么该线程就会一直进行

忙循环—旋转—等待锁重新可用。要是锁未被争用,请求锁的指向线程便能立刻得到它,继续执行。在任意时间,自旋锁都可以防止多于一个的执行线程同时进入临界区。同一个锁可以用在多个位置,例如,对于给定数据的所有访问都可以得到保护和同步

举例:门和锁:自旋锁相当于是钥匙,如果你到门口,发现里面没有人,你就可以拿到钥匙进入房间。如果你到了门口发现里面正好有人,就必须在门外等待里面的人把出来,然后把钥匙给你,你再进去。正是因为有了钥匙(相当于自旋锁),才允许一次只有一个人(相当于执行线程)进入房间(相当于临界区)

  一个被争用的自旋锁使得请求它的线程在等待锁重新可用时自旋(特别浪费处理器的时间),这种行为是自旋锁的要点。所以自旋锁不应该被长时间持有。事实上,这点正是使用自旋锁的初衷:在短期内进行轻量级加锁。还可以采取另外的方式来处理对锁的争用:让请求线程睡眠,直到锁重新可用时再唤醒它。这样处理器就不必循环等待,可以去执行其他代码。这也会带来一定的开销——这里有两次明显的上下文切换,被阻塞的线程要换出和换入,与实现自旋锁的少数几行代码相比,上下文切换当然有较多的代码。

因此,持有自旋锁的时间最好小于完成两次上下文切换的耗时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值