好时光,大家。
我的问题如下:
多个线程在等待一个事件获得读锁,一个线程在等待一个事件获得写锁。在那一刻,任何线程都没有持有锁。
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 的消息,但无法通过电子邮件联系到他。