2

我对 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);
4

1 回答 1

5

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

写锁没有释放,只是你为Timer指定的回调运行在不同的线程上,而那个线程没有持有写锁,所以Assert.AreEqual(true, _lock.IsWriteLockHeld);回调中的断言失败,导致异常。

一个线程进入锁,并且只有那个线程IsWriteLockHeld才成立,并且只有那个线程可以退出锁。

于 2015-01-29T09:40:11.757 回答