【问题标题】:Strange deadlock in C# with single thread and no recursion单线程且无递归的 C# 中的奇怪死锁
【发布时间】:2011-08-13 15:35:53
【问题描述】:

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

有什么想法吗?

干杯, 多伦

【问题讨论】:

  • 疯狂猜测,但可能是为了锁定一个不能是readonly的对象?
  • @Dan 锁定不会发生在引用本身上,而是发生在实例上。所以readonly应该没有效果。
  • 不做多线程的时候为什么会有锁?听起来很可疑......
  • 问题显然不仅仅出在您提供的代码中。请尝试提供重现问题的最小样本
  • 你一定是在调试中误解了一些东西。单个线程不可能等待它自己持有的锁——递归与否;如果它本身已经持有锁,则允许进入后续的受保护块。

标签: c# multithreading locking deadlock


【解决方案1】:

一些可能会有所帮助的提示。我会执行以下步骤:

  1. 右键_lock找到所有 使用 Visual Studio 的参考 上下文菜单。也许你正在使用 其他地方的锁(你在更新中做了)。
  2. 确保锁不是staticProductionNode 类不是 singleton
  3. 您的线程可能是 被困在里面 DAL.InsertJobIfNotExists所以 记录它的入口和出口 将有助于追踪问题根源。

【讨论】:

    【解决方案2】:

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

    基本上,在windbg 中尝试:

    1 .加载 psscor2:

    .load C:\tools\psscor2\amd64\psscor2 [替换为您放置 psscor2 dll 的路径]

    2 。尝试使用

    查找哪些线程持有哪些锁

    !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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 2015-02-24
      相关资源
      最近更新 更多