none
太奇怪了---CriticalSection Deadlock with OwningThread of zero RRS feed

  • 问题

  • windbg:

    CritSec +222d44 at 00222D44
    LockCount 2
    RecursionCount 1
    OwningThread 0
    EntryCount 1716
    ContentionCount 0
    *** Locked

    为什么会这样?  这个00222D44 内存没有被破坏,但OwningThread 0 ???

    我的程序每次都会死锁,死锁的地方都不一样,但每次都是OwningThread 0 ,为什么?  什么情况下会这样?

    2013年8月1日 14:41

答案

  • 您好:

    您能提供一些关于您问题的详细信息么。

    死锁的发生必须具备以下四个必要条件

    1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

    2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

    3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

    4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0P1P2···Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……Pn正在等待已被P0占用的资源。

    处理死锁的方法可归结为以下四种:

    1) 预防死锁。

    这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。

    2) 避免死锁。

    该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。

    3)检测死锁。

    这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。

    检测方法包括定时检测、效率低时检测、进程等待时检测等。

    4)解除死锁。

    这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。


    Sunny Cao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月2日 11:51
    版主
  • 应该是你的代码中有数组越界

    新浪微博http://weibo.com/xianglitian,欢迎围观

    2013年8月5日 1:56

全部回复

  • 您好:

    您能提供一些关于您问题的详细信息么。

    死锁的发生必须具备以下四个必要条件

    1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

    2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

    3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

    4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0P1P2···Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……Pn正在等待已被P0占用的资源。

    处理死锁的方法可归结为以下四种:

    1) 预防死锁。

    这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。

    2) 避免死锁。

    该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。

    3)检测死锁。

    这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。

    检测方法包括定时检测、效率低时检测、进程等待时检测等。

    4)解除死锁。

    这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。


    Sunny Cao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月2日 11:51
    版主
  • 应该是你的代码中有数组越界

    新浪微博http://weibo.com/xianglitian,欢迎围观

    2013年8月5日 1:56