gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:40 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com