.net ReaderWriterLockSlim将永远锁定
大家好 我的问题如下: 许多线程正在等待事件获取读锁,一个线程正在等待事件获取写锁。在那个时刻,锁不被任何螺纹固定.net ReaderWriterLockSlim将永远锁定,.net,multithreading,clr,readerwriterlockslim,.net,Multithreading,Clr,Readerwriterlockslim,大家好 我的问题如下: 许多线程正在等待事件获取读锁,一个线程正在等待事件获取写锁。在那个时刻,锁不被任何螺纹固定 0:173> !do 0x0000000001c679f8 Name: System.Threading.ReaderWriterLockSlim ... Value Name 1 fIsReentrant 0 myLock 1 numWriteWaiters 28 numReadWaiters 0 numWriteUpgradeWaiters 0 numUpg
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;
首先,我假设线程中止会对锁的状态进行这种破坏。很容易重现问题:
我让锁的用法看起来像
try {} finally { lock.EnterXYZ(); }
try { /* resource usage code */ } finally { lock.ExitXYZ(); }
并且确定中止只能在try{/*资源使用代码*/}内发生
现在我又遇到了一个同样的问题,我的想法也没有了
我必须说,这种情况在24个核心环境中时有发生。这可能是ht/milticore/多处理器系统上的RWLS错误吗?我看到ReaderWriterLockSlim类在没有互锁指令的情况下更新其成员,这可能是多核环境中的一个潜在问题
PS:我想听听ReaderWriterLockSlim的作者Joe Duffy的意见,但无法通过电子邮件联系到他。这还不够好,在x64抖动中,代码仍然可以在第一次最后尝试和第二次尝试之间中止。停止中止线程。您的try/finally示例代码看起来奇怪且无效,使用模式可能就是原因所在。试着做一个SSCCE。我很确定没有线程中止。那只是我的猜测。现在我相信我猜错了,并试图在其他地方找到根本原因。如果没有答案,我们只能猜测。创建一个说明错误的小示例。您不太可能在
ReaderWriterLockSlim
中发现错误。不过,您让我们猜测,这很快就会过时。