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)
通过构造函数的外观,您使用的是System.Threading.Timer
.该计时器的回调在线程池线程上运行.
写锁定未释放,只是您为Timer指定的回调在不同的线程上运行,并且该线程不保持写锁定,因此Assert.AreEqual(true, _lock.IsWriteLockHeld);
回调中的断言失败,从而导致异常.
一个线程进入锁定,只有该线程确实IsWriteLockHeld
成立,并且只有该线程可以退出锁定.