ReaderWriterLockSlim永远被锁定

时间:2013-12-09 12:08:31

标签: .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 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,但无法通过电子邮件与他联系。

0 个答案:

没有答案