在上述加锁的伪代码中演示了上步骤:
- 对寄存器的内容进行清0
- 把mutex的值(被使用值为0,未被使用值为1)和寄存器的内容进行交换
- 寄存器的内容为1代表得到了锁,为0代表未得到锁,要挂起等待

文章插图
解锁的伪代码步骤(只有有锁的线程才可以执行到这段代码):
- 把mutex的值改为1
- 唤醒等待锁的线程
举个例子:

文章插图
这里线程1先申请资源1,申请到了之后,资源1被锁死(资源1会永远被线程1申请,因为只有申请到资源2执行完临界代码,才会释放掉资源1,此时线程1被卡在申请资源2的点,根本走不到释放资源1的代码,所以会一直被线程1占有),线程2无法申请,线程2先申请资源2,同样资源2也被锁死,这样当线程1继续向下申请资源2的时候,就被阻塞在那里,线程2在向下申请资源1的时候,也被阻塞在那里,这就形成了死锁,永远解不了锁 。
死锁引起的原因:
- 竞争不可抢占资源引起死锁:这就是上述情况,都在等待对方占有的不可抢占的资源
- 竞争可消耗资源引起的死锁:有p1,p2,p3三个进程,p1向p2发送消息并接受p3发送的消息,p2向p3发送消息并接收p1的消息,p3向p1发送消息并接收p2的消息,如果设置时先接收消息后发送消息,则所有的信息都不能发送,这就造成死锁
- 互斥条件:一个资源每次只能被一个执行流使用
- 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺
- 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系
- 破坏请求和保持条件
- 协议1:所有进程开始前,必须一次性地申请所需的所有资源,这样运行期间就不会再提出资源的需求,破坏了请求条件,即使有一种资源不能满足需求,也不会给它分配正在空闲的资源,这样它就没有资源,就破坏了保持条件,从而预防死锁
- 协议2:允许一个进程只获得初期的资源就开始运行,然后再把运行完的资源释放出来,然后再请求新的资源
- 破坏不可抢占条件
- 当一个已经保持了某种不可抢占资源的进程,提出新资源请求不能被满足的时候,它必须释放已经保持的所有资源,以后需要的时候再申请
- 破坏循环等待条件
- 对系统中的所有资源类型进行线性排序,然后规定每个进程必须按序列号递增的顺序请求资源 。加入进程请求到了一些序列号较高的资源,然后请求一个序列号较低的资源时,必须先释放相同的更高序号的资源后才能申请低序列号的资源,多个同类资源必须一起请求
经验总结扩展阅读
- 1500大卡相当于多少食物
- 为什么二手房越来越难卖
- 龙眼泡酒配方
- 香菇蒸多久能蒸熟
- 一条香烟不拆封能放多久
- 2023年农历七月十二适不适合结婚
- 2023年农历七月十六可不可以结婚农历二零二三年七月十六能不能结婚
- 2023年农历七月二十结婚会幸福吗
- 2023年农历七月二十一是不是结婚吉日 今天可以迎亲吗
- 2023年农历七月二十二结婚吉利吗 是黄道吉日吗