首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过注入检测DeadLock

通过注入检测DeadLock
EN

Stack Overflow用户
提问于 2010-07-08 16:22:06
回答 3查看 1.3K关注 0票数 2

如何通过包含用于锁定和解锁的挂钩函数的注入DLL来设计用于检测死锁的算法。

实际上,我想用设备和算法来检测死锁。在这方面,如果有人能告诉我,我会很高兴。

EN

回答 3

Stack Overflow用户

发布于 2010-07-08 17:45:03

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

从高层次的角度来看,您想要的是记录每个线程持有的锁,并查看获取锁是否会导致死锁。您可以使用依赖图来可视化这一点,循环表示死锁。

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

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

  • T1 grab M1
  • T2 grab M2,wait for M1
  • T3 grab M3,wait for M2

,wait for M1

  • T3 grab M3,wait for M2

如果T1等待M3,那么你就完蛋了(你有一个循环),因此在尝试抓取之前,你需要检查这种情况。

您可以使用以下命令对其建模:

  • a table,其中列出了持有给定互斥锁
  • a图的线程,表示线程之间的依赖关系

如果我们对T1试图获取M3时的情况进行建模,我们会得到:

代码语言:javascript
复制
Table
M1 -> T1,
M2 -> T2,
M3 -> T3,

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

T1试图抓取M3

  • 它查找表格并列出持有它的线程,这里T3.
  • It检查在图中添加边T1 -> T3是否形成循环。
票数 3
EN

Stack Overflow用户

发布于 2010-07-08 21:26:51

看,this CP article --恐怕你不是原创。另请参阅this microsoft.public.win32.programmer.kernel article,其中一位微软员工解释了WIndows内置选项。

票数 2
EN

Stack Overflow用户

发布于 2014-03-08 17:01:53

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

为此,你需要维护一个结构,比如

结构过程

{

代码语言:javascript
复制
  int process_id;

  int curr_res;

  int want_in_future;

};

表示将是……

(R1)->P1->(R2)

意思是..。R1已分配给P1,现在此进程希望在将来使用R2

但是这样的选择可能会让你陷入僵局,比如

对于p1 (R1)->P1->(R2)

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

循环方式存在,因此死锁也会存在

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3201786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档