Linux:死锁与解决方法

死锁

死锁:指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

死锁现象:

  • 现象1,如果执行流加锁完毕后,不进行解锁则会造成死锁(上篇所述);
  • 现象2,线程A获取了1锁,线程B获取了2锁,同时线程A还想获取2锁,线程B还想获取1锁

现象2模拟:


Linux:死锁与解决方法_第1张图片Linux:死锁与解决方法_第2张图片
两个线程都处于阻塞状态

死锁的必要条件

  1. 互斥:一个执行流获取互斥锁后,其它执行流不能再获取该锁;
  2. 不可剥夺:A执行流拿着锁,其它执行流不能释放;
  3. 循环等待:多个执行流拿着对方想要的锁,并且各执行流还去请求对方的锁;
  4. 请求与保持:执行流本身使用着一把锁并不释放,还在请求别的锁;

解决方案:


  1. 使线程的加锁顺序一致
    Linux:死锁与解决方法_第3张图片

  1. 破坏环路等待条件
    使用非阻塞锁,一旦线程发现请求的锁被使用,就去释放自己拥有的锁
    Linux:死锁与解决方法_第4张图片

  1. 在加锁前,将临界资源一次性分配给线程A再加锁

try锁:尝试加锁,成功–,加锁失败后直接返回错误信号,不阻塞

读写锁:只有一个锁
写模式加锁,所有线程都会被阻塞(不论此线程是读还是写)
读模式加锁,对读线程加锁成功,写模式过来的加锁被阻塞。
读写模式加锁,阻塞读线程,加锁写线程

如果该锁被其它人拿走,函数直接返回

相交互斥锁,当读线程(对数据进行读操作)多时,效率高
pthread rwlock init

你可能感兴趣的:(Linux系统编程,linux,锁)