死锁检测通过注射

时间:2010-07-08 08:22:06

标签: c++

如何通过包含用于锁定和解锁的钩子函数的注入DLL来设置algorithem以进行死锁检测。

实际上我想设备和algorithem进行死锁检测。如果有人能帮我这么做的话。

3 个答案:

答案 0 :(得分:3)

从概念上讲,死锁检测原则上很简单,但很难实现。

从高级别的角度来看,你想要的是记录每个线程持有的锁,看看获取锁是否会导致死锁。您可以使用依赖关系图将其可视化,循环意味着死锁。

但是,您可以使用其他操作进行同步:例如自旋锁定。这些将搞砸任何检测尝试,所以要注意这些限制。

所以让我们首先进行模拟:想象3个线程(T1,T2,T3)和3个互斥(M1,M2,M3)

  • T1抢M1
  • T2抢M2,等待M1
  • T3抢M3,等待M2

如果T1等待M3你被搞砸了(你有一个周期),那么在尝试抓住之前,你需要检查这种情况。

您可以使用以下方式对此进行建模:

  • 一个表,列出了包含给定互斥锁的线程
  • 一个图表,表示线程之间的依赖关系

如果我们在T1尝试抓取M3的情况下对情况进行建模,我们就有:

Table
M1 -> T1,
M2 -> T2,
M3 -> T3,

Graph
{T1, T2, T3} x {T2 -> T1, T3 -> T2}

T1尝试抓取M3时:

  • 它查找表并列出包含它的线程,T3
  • 它会检查在图表中添加边T1 -> T3是否形成一个循环。

答案 1 :(得分:2)

this CP article - 你不是原创的我害怕。另请参阅this microsoft.public.win32.programmer.kernel article,其中Microsoft员工解释了WIndows内置选项。

答案 2 :(得分:0)

一个简单的算法是为资源分配制作一个等待图...

为此你维持一个像

这样的结构

struct process

{

  int process_id;

  int curr_res;

  int want_in_future;

};

表示将是....

(R 1) - - - - > [P1] ------>(R2)

意思是......已经将R1分配给P1,现在这个过程将希望将来有R2

但是这个选择可能会导致你像DEADLOCK一样

表示p1(R1)-----> [P1] ------>(R2)

对于p2(R2)-----> [P2] ------>(R1)

这是一个循环的方式,所以会出现死锁