Skip to main content
 首页 » 编程设计

c#之单线程且无递归的 C# 中的奇怪死锁

2024年02月23日28虾米哥

我遇到了我的 C# 应用程序的奇怪行为。

我正在通过 VS2010 以 Debug模式运行应用程序,几个小时后,应用程序只是等待锁释放,但唯一存活的线程是等待锁释放的线程,其中没有递归功能:

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 对象的单个线程,其他线程使用其他对象类型。

有什么想法吗?

干杯, 多伦

请您参考如下方法:

我建议使用 windbg(Windows 调试工具,包含在 Windows SDK 中)和 psscor2更深入地调试您的问题。

基本上,在 windbg 中尝试:

1 。加载 psscor2:

.load C:\tools\psscor2\amd64\psscor2 [replace with the path where you put the psscor2 dll]

2。尝试查找哪些线程正在使用哪些锁

!syncblk

3。查看正在运行的线程并与持有锁的线程进行比较

!线程

4。在线程之间切换

~Xs *[其中 X 是您从 !threads 获得的线程 ID,您对它感兴趣,因为它持有锁]*

  1. 查看当前线程的托管调用堆栈,找出在获取锁之前发生了什么

!clrstack -a

编辑:

由于您可能正在使用 .net 4,您可能想要使用 SOSEX而不是 psscor2。到目前为止我还没有真正使用过 SOSEX,但我想看看死锁命令:!dlk