【整理归纳】线程死锁*

作者: pangdaaa | 来源:发表于2017-06-03 14:02 被阅读30次

系统环境 centos6.5

什么是死锁

是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外部处理作用,它们都将无限等待下去。

  • 死锁原因
    系统资源不足;
    进程(线程)推进的顺序不恰当;
    资源分配不当;
死锁产生的4个必要条件
  • 互斥条件:所谓互斥就是进程在某一时间内独占资源。
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

常见死锁形成的场景
  死锁形成的常见情况有以下几种:
** 忘记释放锁**

void data_process()
{
      EnterCriticalSection();
      if(/* error happens, forget LeaveCriticalSection */) 
           return;
      LeaveCriticalSection();
}

** 单线程重复申请锁**

void sub_func()
{
    EnterCriticalSection();
    do_something();
    LeaveCriticalSection();
}

void data_process()
{
    EnterCriticalSection();
    sub_func();
    LeaveCriticalSection();
}

** 多线程多锁申请**

void data_process1()
{
    EnterCriticalSection(&cs1);  // 申请锁的顺序有依赖
    EnterCriticalSection(&cs2);
    do_something1();
    LeaveCriticalSection(&cs2);
    LeaveCriticalSection(&cs1);
}

void data_process2()
{
    EnterCriticalSection(&cs2);  // 申请锁的顺序有依赖
    EnterCriticalSection(&cs1);
    do_something2();
    LeaveCriticalSection(&cs1);
    LeaveCriticalSection(&cs2);
}

** 环形锁申请**

/* 多个线程申请锁的顺序形成相互依赖的环形:
*             A   -  B
*             |      |
*             C   -  D
*/
如何避免死锁?常见算法与原理
  • 时刻检查自己写的程序有没有在跳出时忘记释放锁。
  • 如果自己的模块可能重复使用一个锁,建议使用嵌套锁。
  • 对于某些锁代码,不要临时重新编写,建议使用库里面的锁,或者自己曾经编写的锁。
  • 如果某项业务需要获取多个锁,必须保证锁的按某种顺序获取,否则必定死锁。
  • 编写简单的测试用例,验证有没有死锁。
  • 编写验证死锁的程序,从源头避免死锁。

要预防和避免死锁的发生,只需将上面所讲到的4个条件破坏掉其中之一即可。一般而言破坏“循环等待”这个条件是解决死锁最有效的方法。

银行家算法解决死锁

相关文章

  • 【整理归纳】线程死锁*

    系统环境 centos6.5 什么是死锁 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相...

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • Python中的各种锁

    Python之死锁 死锁分为两种情况,多进程/线程的死锁.或者是单线程的死锁. 1.首先看一下单线程的死锁,单线程...

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • 6. 使用synchronized实现死锁

    死锁定义 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 面试官:连多线程问题你都一问三不知,还要我怎么“放水”?

    面试官:问你几个多线程相关的问题吧,说一下导致线程死锁的原因,怎么解除线程死锁? 程序员阿里:这个...死锁......

  • 十.Java并发编程的挑战

    1. 死锁 线程死锁 死锁是指两个或多个线程被阻塞等待获取某些其他线程所持有的锁。当多个线程同时需要相同的锁,但以...

  • Java多线程之死锁(Deadlock)及死锁避免(Deadlo

    线程死锁(Thread Deadlock) 数据库死锁(Database Deadlocks) 死锁避免 (Dea...

  • Java自学-多线程 死锁

    Java 演示多线程死锁 当业务比较复杂,多线程应用里有可能会发生死锁 步骤 1 : 演示死锁 线程1 首先占有对...

网友评论

    本文标题:【整理归纳】线程死锁*

    本文链接:https://www.haomeiwen.com/subject/mboyfxtx.html