采用临界区X,在线程A与B中使用,默认B很少使用X,程序运行正常,但是在某个条件下,我让B频繁使用临界区X后,就发生了死锁。我在每次EnterCriticalSection()与 LeaveCriticalSection 或TryEnterCriticalSection()后都会TRACE()操作成功与否的信息,发现A线程锁定后又离开了X,它再尝试进入X时就进不去了,而信息中没有显示B在使用,看了下X中的RecursionCount为1,确实是被锁住了,但是不知道怎么锁住,被哪个线程锁住。至于那个B线程,它在尝试进入X时也是失败。大家有没有遇到过这种情况呢?

解决方案 »

  1.   

    EnterCriticalSection一定要和LeaveCriticalSection配对使用,你一定是哪里少LeaveCriticalSection了。
      

  2.   

    贴代码吧,你这样说谁也不清楚是什么原因
    顺便说依稀,是不是中间有什么判断,跳出了函数,导致没有执行LeaveCriticalSection?
      

  3.   

    肯定哪里没有离开临界区.导致死锁int XXFun()
    {
        EnterCriticalSection;    if(x){
             // LeaveCriticalSection; 一般很容易有人在这里出bug.忘了离开临界区.导致死锁..仔细检查代码
              return 1;
        }    LeaveCriticalSection;
    }
      

  4.   

    有EnterCriticalSection,后面每一条路径都必须保证有LeaveCriticalSection