互斥锁与自旋锁

一:互斥锁:当锁时可用的,调用上锁的API会成功,并且将锁设置为不再可用。当一个进程尝试获取不可用的锁的时候它会阻塞,直到锁被释放。

进入临界区时获得锁,退出临界区时释放锁。

二:自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

与互斥锁类似,都是为了保护共享资源。互斥锁是当资源被占用,申请者进入睡眠状态;而自旋锁则循环检测保持者是否已经释放锁。

自旋锁比较适用于锁使用者保持锁时间比较短(等待时间小于两次上下文切换)的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。

 

自旋锁在单处理器与多处理器系统中的实现是不同的。

对于单处理器而言,需要考虑是否关闭内核抢占功能

如果关闭抢占功能,此时线程在内核模式下运行就不会被打断,此时相当于顺序执行锁的意义不大,在编译时会被删除

如果启用内核抢占,即别的内核线程可以打断当前运行线程,别的抢占执行结束之后才会执行之前的,所以锁任然没有意义,在编译时会被删除

在多处理器的情况下,内核中处理线程考虑线程安全时,自旋锁的存在是有意义的,所以会编译进入。

 

自旋锁的优点:

1.自旋锁不会使线程状态发生切换,一直处于用户态,即线程一直都是active的;不会使线程进入阻塞状态,减少了不必要的上下文切换,执行速度快

2.非自旋锁在获取不到锁的时候会进入阻塞状态,从而进入内核态,当获取到锁的时候需要从内核态恢复,需要线程上下文切换。 (线程被阻塞后便进入内核(Linux)调度状态,这个会导致系统在用户态与内核态之间来回切换,严重影响锁的性能)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值