【发布时间】: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