互斥锁,解决原子性问题以及加锁后引发的死锁

互斥锁,解决原子性问题以及加锁后引发的死锁
原子性的问题就是线程切换。在单核时代,同一时刻只有一个线程工作,禁用CPU中断就能禁止线程切换。多核时代,同一时刻可能有多个线程在执行,禁用CPU中断并不能解决原子性问题。经过上述分析得出结论,同一时刻只有一个线程执行是解决原子性问题的必要条件,这个条件称之为互斥,保证共享变量的修改是互斥的,无论是单核还是多核,都可以保证其原子性。
这里增加多一个概念:细粒度锁:用不同的锁对受保护资源进行精细化管理,能够提升性能。
解决原子性问题的方法就是使中间状态不可见
使用细粒度锁是有代价的,这个代价就是有可能导致死锁:一组互相竞争资源的线程因相互等待,导致永久阻塞的现象死锁出现的四个必要条件:(1)互斥:共享资源X和Y只能被一个线程占用
(2)占有且等待:线程T1已经取得共享资源X,在等待共享资源Y时,不释放共享资源X
(3)不可抢占:其他线程不能强行抢占线程T1占有的资源
(4)循环等待:线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,这就是循环等待
因此只要我们破环其中一个条件,就可以避免死锁
互斥是无法被破坏掉的,因为我们加锁就是为了互斥

破坏占有且等待条件:思路就是一次申请所有共享资源 X和Y,要增加一个资源管理者,来管理X和Y,控制你只能一次性拿到X和Y,不然就都拿不到
破坏不可抢占条件:核心就是线程能主动释放它所占有的资源

破坏循环等待条件:破坏这个条件,需要对资源进行排序,然后按序申请资源

猜你喜欢

转载自blog.csdn.net/weixin_42683077/article/details/105873694