none
vs2005 中, 有没有办法可以检测死锁? RRS feed

答案

  • Hi sailuer

    据我所知,vs2005中没有提供死锁检测的功能。我们在写多线程的程序时一定要注意避免死锁。

    在实际的操作系统中往往采用死锁的检测与恢复方法来排除死锁

    下面我们再来看一看死锁检测算法。死锁检测算法是当进程进行资源请求时检查并发进程组是否构成资源的请求和占用环路。如果不存在这一环路,则系统中一定没有死锁算法使用的数据结构是如下这些:      

          占有矩阵An*m阶,其中n表示并发进程的个数,m表示系统的各类资源的个数,这个矩阵记录了每一个进程当前占有各个资源类中资源的个数。

           申请矩阵Rn*m阶,其中n表示并发进程的个数,m表示系统的各类资源的个数,这个矩阵记录了每一个进程当前要完成工作需要申请的各个资源类中资源的个数。

           空闲向量T:记录当前m个资源类中空闲资源的个数。

           完成向量F:布尔型向量值为真(true)或假(false),记录当前n个并发进程能否进行完。为真即能进行完,为假则不能进行完。

           临时向量W:开始时W=T

    算法步骤:

         1W=T

         对于所有的i=12...n

         如果A[i]=0,则F[i]=true;否则,F[i]=false

         2)找满足下面条件的下标i

         F[i]=false并且R[i]=W

         如果不存在满足上面的条件i,则转到步骤(4)。

         3W=W+A[i]

         F[i]=true

         转到步骤(2

         4)如果存在iF[i]=false,则系统处于死锁状态,且Pi进程参与了死锁。

    以下一些资料是讲解如何检测和结束死锁:

    http://msdn.microsoft.com/zh-cn/partners/ms178104.aspx

    http://msdn.microsoft.com/en-us/library/ff543668(VS.85).aspx

    我们可以使用以下链接提供的代码和库赖检测死锁(注意:它是用c#写的)

    http://www.codeproject.com/KB/dotnet/Deadlock_Detection.aspx

     

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年2月25日 7:45
    版主