c# – 使用ReaderWriterLockSlim调试死锁
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用ReaderWriterLockSlim调试死锁,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2724字,纯文字阅读大概需要4分钟。
内容图文
![c# – 使用ReaderWriterLockSlim调试死锁](/upload/InfoBanner/zyjiaocheng/779/16d7d12d93e34a21a555537e44dddf17.jpg)
我正在调试一个针对.NET 3.5的托管应用程序中的挂起.其中一个线程正在等待System.Threading.ReaderWriterLockSlim.EnterWriteLock方法.为了找出哪个线程拥有锁,我检查了internal member field ReaderWriterCount[] rwc的ReaderWriterLockSlim类以及它包含的所有ReaderWriterCount和RecursiveCounts对象.这些对象包含有关所有线程的信息.除了包含readercount = 1的单个对象外,所有对象都包含writercount = 0和readercount = 0:
[53] 0144fc84
Name: System.Threading.ReaderWriterCount
MethodTable: 6bb4e930
EEClass: 6b9ba4d0
Size: 24(0x18) bytes
(C:\Windows\assembly\GAC_MSIL\System.Core\3.5.0.0__b77a5c561934e089\System.Core.dll)
Fields:
MT Field Offset Type VT Attr Value Name
55782f94 4000625 c System.Int32 1 instance 53 threadid
55782f94 4000626 10 System.Int32 1 instance 1 readercount
6bb4e930 4000627 4 ...ReaderWriterCount 0 instance 00000000 next
6bb4e858 4000628 8 ...g.RecursiveCounts 0 instance 0144fc9c rc
AFAIU意味着具有MTID 53的线程拥有锁.我用kb转储堆栈(!clrstack失败,因为它不是托管线程)并得到以下内容:
ChildEBP RetAddr Args to Child
16eee9b4 765c14ab 00000280 00000000 16eee9fc ntdll!ZwWaitForSingleObject+0x15
16eeea20 778d1194 00000280 00009c40 00000000 KERNELBASE!WaitForSingleObjectEx+0x98
16eeea38 681954d7 00000280 00009c40 00000000 KERNEL32!WaitForSingleObjectExImplementation+0x75
16eeea7c 68195423 00000280 00009c40 00000000 mscorwks!PEImage::LoadImage+0x1af
16eeeacc 68195442 00009c40 00000000 00000000 mscorwks!CLREvent::WaitEx+0x117
16eeeae0 681d95c7 00009c40 00000000 00000000 mscorwks!CLREvent::Wait+0x17
16eeeb60 681d9a55 03376058 00009c40 00000000 mscorwks!ThreadpoolMgr::SafeWait+0x73
16eeebc4 68226508 00000000 00000000 00000000 mscorwks!ThreadpoolMgr::WorkerThreadStart+0x11c
16eefa64 778d338a 04b2e5c8 16eefab0 77e09f72 mscorwks!Thread::intermediateThreadProc+0x49
16eefa70 77e09f72 04b2e5c8 6aecf560 00000000 KERNEL32!BaseThreadInitThunk+0xe
16eefab0 77e09f45 682264c2 04b2e5c8 00000000 ntdll!__RtlUserThreadStart+0x70
16eefac8 00000000 682264c2 04b2e5c8 00000000 ntdll!_RtlUserThreadStart+0x1b
这意味着它是Idle CLR Worker Thread.
我的第一个想法是,当读取器锁定并不总是被释放时,应用程序代码中存在一个错误.但该假设未得到证实,因为代码在ReaderWriterLockSlim.EnterWriteLock上使用了包装器,如下所示:
readerWriterLockSlim.EnterReadLock();
try
{
return executeFunc();
}
finally
{
readerWriterLockSlim.ExitReadLock();
}
finally块必须保证始终释放锁.
有没有想过这种情况怎么可能?在获取锁之后,线程是否会以某种方式被中止,但最终成为空闲的线程池线程?可能是如何缩小问题的提示?
附:这个死锁只复制了一次,我只有一个内存转储因此我不能轻易地说在锁周围添加痕迹或断点并试验这个.
解决方法:
试试!sosex.dlk和/或!mlocks和!mwaits.这应该会告诉你发生了什么.
内容总结
以上是互联网集市为您收集整理的c# – 使用ReaderWriterLockSlim调试死锁全部内容,希望文章能够帮你解决c# – 使用ReaderWriterLockSlim调试死锁所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。