Linux/Unix知识点我用 LinuxLinux

【整理归纳】线程死锁*

2017-06-03  本文已影响30人  pangdaaa

系统环境 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个条件破坏掉其中之一即可。一般而言破坏“循环等待”这个条件是解决死锁最有效的方法。

银行家算法解决死锁

上一篇 下一篇

猜你喜欢

热点阅读