二 Linux--多线程( 三 )

在上述加锁的伪代码中演示了上步骤:

  1. 对寄存器的内容进行清0
  2. 把mutex的值(被使用值为0,未被使用值为1)和寄存器的内容进行交换
  3. 寄存器的内容为1代表得到了锁,为0代表未得到锁,要挂起等待

二 Linux--多线程

文章插图
解锁的伪代码步骤(只有有锁的线程才可以执行到这段代码):
  1. 把mutex的值改为1
  2. 唤醒等待锁的线程
死锁概念: 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去 。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程 。
举个例子:
二 Linux--多线程

文章插图
这里线程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的消息,如果设置时先接收消息后发送消息,则所有的信息都不能发送,这就造成死锁
死锁产生的四个必要条件:
  • 互斥条件:一个资源每次只能被一个执行流使用
  • 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺
  • 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系
避免死锁: