我遇到了 ReaderWriterLockSlim 在一系列法律行动后似乎被破坏的场景。
流程是:
- 线程 1 需要写入器 lock1
- 线程 2 尝试获取读卡器 lock1 - 块
- 线程 2 被中断,调用 lock1.ExitReadLock 线程 2 没有获得锁。似乎应该抛出异常。
- 线程 1 退出 lock1 的写入者锁
- 任何试图获取 lock1.EnterReadLock 的线程都将永远阻塞
在上面的第 3 阶段之后,调试器显示 lock1.CurrentReadCount 已损坏 - 似乎已溢出到 0x7FFFFFF。
我想知道是否有人遇到过这种情况,或者我可能遗漏了一些东西。
重现它的代码:
[TestMethod]
public void ReproTest()
{
var rwlock = new ReaderWriterLockSlim();
rwlock.EnterWriteLock();
bool taken = false;
var reader = new Thread(() =>
{
try
{
rwlock.EnterReadLock();
s_logger.Info("Enter");
}
catch (ThreadInterruptedException)
{
rwlock.ExitReadLock();
}
});
reader.Name = "Reader";
reader.Start();
Thread.Sleep(1000);
reader.Interrupt();
Thread.Sleep(1000);
rwlock.ExitWriteLock();
while (!taken)
{
taken = rwlock.TryEnterReadLock(1000);
}
Thread.Sleep(1000);
}