Linux多线程(一)互斥锁,死锁,自旋锁的概念

目录

1. 互斥锁

1.1 什么是互斥锁

1.2为什么要添加互斥锁

1.3 多线程竞争如何解决

2. 死锁

2.1 什么是死锁,举例分析

2.2 死锁产生的必要条件

2.3 如何解决,如何预防死锁?

2.4如何预防死锁

3. 自旋锁

3.1 什么是自旋锁?有何特点

优点

缺点


1. 互斥锁

1.1 什么是互斥锁

        互斥锁是一种独占锁,同一时间只有一个线程可以访问共享的数据资源。每个对象都应于一个可称为“互斥锁”的标记,来标记任何时刻只有一个线程访问这个对象

1.2为什么要添加互斥锁

        一个进程中的多线程之间是共享系统资源的,多个线程同时操作一个对象,当一个线程的操作还没有结束,另一个线程也对他进行操作,导致出现错误,因此需要对被操作对象添加互斥锁,保证每个线程对该对象的操作都能得到正确的结果

1.3 多线程竞争如何解决

        线程不是独立的,数据是共享的,同时访问的时候会出现竞争的状态,造成数据混乱,这就是所谓的线程不安全

  • 解决方法:锁
  1. 好处:原子操作,将我们的一个线程从头到尾完整执行
  2. 坏处:组织了多线程的并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大的下降了

2. 死锁

2.1 什么是死锁,举例分析

  1. 一种情况是线程A永远不释放锁,结果B一直拿不到锁,所以线程B就“死掉”了
  2. 第二种情况下,线程A拥有线程B需要的锁Y,同时线程B拥有线程A需要X,那么这时候线程A/B互相依赖对方释放锁,于是二者都“死掉”了
  3. 如果一个线程总是不能被调度,那么等待此线程结果的线程可能就死锁了。这种情况叫做线程饥饿死锁。比如说非公平锁中,如果某些线程非常活跃,在高并发情况下这类线程可能总是拿到锁,那么那些活跃度低的线程可能就一直拿不到锁,这样就发生了饥饿

2.2 死锁产生的必要条件

  • 互斥条件:一个资源每次只能被一个进程使用
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

2.3 如何解决,如何预防死锁?

  1. 重启,代价太大
  2. 一次性撤销参与死锁的全部进程,剥夺全部资源
  3. 进程回退,很理想但是代价更大,需要很大的堆栈来记录每一步的变化从而实现回退

2.4如何预防死锁

  1. 尽可能的按照锁的使用规范请求锁,另外锁的请求粒度要小(不要在不需要锁的地方占用锁,锁不用了尽快释放);
  2. 在高级锁里面总是使用tryLock或者定时机制(就是指定获取锁超时的时间,如果时间到了还没有获取到锁那么就放弃
     

3. 自旋锁

3.1 什么是自旋锁?有何特点

        线程在内核态与用户态之间切换是比较耗资源的,因此,有必要减少线程在阻塞、唤醒之间的切换。

        eg:如果线程A持有线程B需要的锁,线程B觉得我好不容易来一趟,又要让我进入阻塞等待。不知下次几时才能分配到cpu资源,我能不能再等等,说不定线程A很快就完事。cpu说:可以,但有一个条件,我们不养闲线程,你必须做点事证明自己的用途。这样吧,你就来个自旋舞,给大伙助兴。于是,线程B就一直在自旋,直到线程A释放资源,它马上拿到锁资源,开始干活。

优点

        自旋锁可以减少CPU上下文的切换,对于占用锁的时间非常短或锁竞争不激烈的代码块来说性能大幅度提升,因为自旋的CPO耗时明显少于线程阻塞、挂起、再唤醒时两次CPU上下文切换所用的时间。

缺点

        在持有锁的线程占用锁时间过长或锁的竞争过于激烈时,线程在自旋过程中余长时间获取不到锁资源将列起CPU的浪费。所以在系统中有复杂锁依赖的情况下不适合采用自旋锁。


参考原文链接:https://blog.csdn.net/qq_52563729/article/details/125828312

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值