好时光,全部。
我的问题如下:
许多线程正在等待事件获取读锁定,一个线程正在等待事件获取写锁定。当时任何线程都没有锁定。
0:173> !do 0x0000000001c679f8
Name: System.Threading.ReaderWriterLockSlim
...
Value Name
1 fIsReentrant
0 myLock
1 numWriteWaiters
28 numReadWaiters
0 numWriteUpgradeWaiters
0 numUpgradeWaiters
0 fNoWaiters
-1 upgradeLockOwnerId
-1 writeLockOwnerId
000000000381eb38 writeEvent
00000000035a32e0 readEvent
0000000000000000 upgradeEvent
0000000000000000 waitUpgradeEvent
9 lockID
0 fUpgradeThreadHoldingRead
1073741824 owners
0 fDisposed
0:173> .formats 0n1073741824
Evaluate expression:
Hex: 00000000`40000000
来自ReaderWriterLockSlim.cs:
private const uint WAITING_WRITERS = 0x40000000;
首先,我假设线程中止使这种腐败成为锁定状态。它很容易重现问题:http://chabster.blogspot.com/2013/07/a-story-of-orphaned-readerwriterlockslim.html。
我锁定用法看起来像
try {} finally { lock.EnterXYZ(); }
try { /* resource usage code */ } finally { lock.ExitXYZ(); }
并且确定只能在try {/ *资源使用代码* /}中发生中止。
现在我又遇到了同样问题的另一个转储,我的想法用完了。
我必须说这在24个核心环境中不时发生。它可能是ht / milticore /多处理器系统上的RWLS错误吗?我看到ReaderWriterLockSlim类在没有互锁指令的情况下更新了它的成员,这可能是多核环境中的一个潜在问题。
PS:我想听听ReaderWriterLockSlim的作者Joe Duffy,但无法通过电子邮件与他联系。