Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net ReaderWriterLockSlim将永远锁定_.net_Multithreading_Clr_Readerwriterlockslim - Fatal编程技术网

.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
中发现错误。不过,您让我们猜测,这很快就会过时。