一連の法的措置の後、ReaderWriterLockSlim が壊れたように見えるシナリオに遭遇しました。
フローは次のとおりです。
- スレッド 1 はライター ロック 1 を取得します
- スレッド 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);
}