ReaderWriterLockSlim和计时器

aer*_*hov 2 .net c# multithreading readerwriterlockslim

我对ReaderWriterLockSlim感到沮丧并且延迟了ExitWriteLock.为什么WriteLock在定时器中发布回调?

var _lock = new ReaderWriterLockSlim();
_lock.EnterWriteLock();
Assert.AreEqual(true, _lock.IsWriteLockHeld);   // good

System.Threading.Timer timer = new Timer(state =>
{
    _lock.ExitWriteLock(); //throws exception that lock is not held
}, null, 1, -1);

Thread.Sleep(1000);
Assert.AreEqual(false, _lock.IsWriteLockHeld);
Run Code Online (Sandbox Code Playgroud)

Wil*_*mpt 5

通过构造函数的外观,您使用的是System.Threading.Timer.该计时器的回调在线程池线程上运行.

写锁定未释放,只是您为Timer指定的回调在不同的线程上运行,并且该线程保持写锁定,因此Assert.AreEqual(true, _lock.IsWriteLockHeld);回调中的断言失败,从而导致异常.

一个线程进入锁定,只有该线程确实IsWriteLockHeld成立,并且只有该线程可以退出锁定.