ReaderWriterLockSlim 和计时器
ReaderWriterLockSlim and timer
我对 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);
从构造函数的外观来看,您使用的是 System.Threading.Timer
。该计时器的回调在线程池线程上运行。
写锁没有释放,只是你为定时器指定的回调在不同的线程上运行,而那个线程没有持有写锁,所以回调中的断言Assert.AreEqual(true, _lock.IsWriteLockHeld);
失败,导致异常。
一个线程进入锁,只有那个线程 IsWriteLockHeld
成立,只有那个线程可以退出锁。
我对 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);
从构造函数的外观来看,您使用的是 System.Threading.Timer
。该计时器的回调在线程池线程上运行。
写锁没有释放,只是你为定时器指定的回调在不同的线程上运行,而那个线程没有持有写锁,所以回调中的断言Assert.AreEqual(true, _lock.IsWriteLockHeld);
失败,导致异常。
一个线程进入锁,只有那个线程 IsWriteLockHeld
成立,只有那个线程可以退出锁。