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

标签 c# multithreading locking deadlock

我遇到了我的 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

关于c# - 单线程且无递归的 C# 中的奇怪死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5801048/

相关文章:

Android Activity 生命周期和锁定/解锁设备

c# - 在文本框中选择特定行?

c# - EditorFor 和 StringLength DataAnnotations

c# - 我怎样才能打开一个文件,使其长度应该是 94 的倍数

performance - 有人用过谷歌性能工具吗?

我可以将文件描述符限制设置为每线程限制吗?

objective-c - 执行选择器不工作

c# - 相当于 RNGCryptoServiceProvider 的 JavaScript

java - 通过锁链锁

mySQL datetime比较语法错误