在多线程编程中,除了要解决数据访问的同步与互斥之外,还需要解决的重要问题就是多线程的死锁问题。所谓死锁: 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外部处理作用,它们都将无限等待下去。
一、死锁原因与形成条件
死锁形成的原因:
死锁形成的条件:
从编程经验上来讲,形成死锁的一般原因有以下几种:
二、常见死锁形成的场景
死锁形成的常见情况有以下几种:
2.1 忘记释放锁
void data_process()
{
    EnterCriticalSection();
    if(/* error happens, forget LeaveCriticalSection */)
        return;
    LeaveCriticalSection();
}
2.2 单线程重复申请锁
void sub_func()
{
    EnterCriticalSection();
    do_something();
    LeaveCriticalSection();
}
void data_process()
{
    EnterCriticalSection();
    sub_func();
    LeaveCriticalSection();
}
2.3 多线程多锁申请
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);
}
2.4 环形锁申请
/* 多个线程申请锁的顺序形成相互依赖的环形: * A - B * | | * C - D */
三、死锁的避免策略
死锁的代价是非常大的,有时候很难检测排查,因此需要在编程过程中尽可能的避免发生死锁。编程中为了避免死锁应该遵循如下策略:
原文:http://www.cnblogs.com/cyyljw/p/8006854.html