2011-04-27 41 views
1

我遇到了一个奇怪的行为,我的C#应用​​程序。单线程和无递归C#中的奇怪死锁

我正在通过VS2010以调试模式运行应用程序,几个小时后应用程序只是等待一个锁释放,但唯一活着的线程是等待锁释放并且没有递归的该函数:

class ProductionNode  { 
    private readonly object _lock = new object(); 
    public bool Activate(long jobId) 
    { 
     lock(_lock) // Doesn't go through here 
     { 
     return DAL.InsertJobIfNotExists(jobId)>0; //SQL PLAIN INSERT IF NOT EXIST COMMAND 
     } 
    } 
    public void HasJobs() 
    { 
     lock(_lock) 
     { 
      return DAL.HasProductionJobs(); 
     } 
    } 
}  

同样,当我暂停使用VS2010使用该ProductionNode唯一线程应用程序是等待被释放的_lock对象中的一个。

为了清楚起见,应用程序可能会激活多个线程中的生产节点,但在发生死锁的给定场景中,VS只显示使用ProductionNode对象的单个线程,其他线程使用其他对象类型。

有什么建议吗?

干杯, 多伦

+0

疯狂的猜测,但也许锁定一个对象,它不能'只读'? – 2011-04-27 08:05:56

+0

这是代码中唯一一个获取该锁的代码?这部分代码对我来说看起来非常好。 – CodesInChaos 2011-04-27 08:07:19

+2

@Dan锁定不会发生在引用本身上,而是发生在实例上。所以'只读'应该没有效果。 – CodesInChaos 2011-04-27 08:08:18

回答

1

一些提示,可以帮助。我会去下列步骤操作:

  1. 右键单击_lock和使用Visual Studio 上下文菜单中找到所有 引用。也许你在别的地方使用了 锁(你在更新中做过)。
  2. 确保锁不staticProductionNode类不是 singleton
  3. 很可能你的线程的是一种媚惑 DAL.InsertJobIfNotExists所以 记录它的入口和出口 将有助于找到问题根源。
3

我推荐使用windbg(Dbugging工具的Windows,包括在Windows SDK)和psscor2调试您的问题深入一点。

基本上,在windbg尝试:

1。负载psscor2:

.load C:\工具\ psscor2 \ AMD64 \ psscor2

2与你放置psscor2 DLL的路径替换。尝试发现哪些线程持有哪些锁使用

!syncblk

3。看看线程正在运行的,并比较了线程持有锁

!threads

4。线程之间

~Xs *[where X is the thread id you got from !threads and that you are interested in because it's holding a lock]*

  1. 看看当前线程的管理调用堆栈交换机以找出发生了什么事情被收购
锁之前

!clrstack -a

编辑:

既然你可以推测使用.net 4,您可能需要使用SOSEX而不是psscor2。我到目前为止还没有真正使用SOSEX,但是我会看看死锁命令:!dlk