【问题标题】:ReaderWriterLockSlim and timerReaderWriterLockSlim 和计时器
【发布时间】:2015-01-29 09:28:52
【问题描述】:

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

【问题讨论】:

标签: c# .net multithreading readerwriterlockslim


【解决方案1】:

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

写锁没有释放,只是你为 Timer 指定的回调在不同的线程上运行,而那个线程持有写锁,所以断言@987654322回调中的@失败,导致异常。

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

【讨论】:

  • 我已经编辑了问题,ExitWriteLock 也抛出异常。但是让我猜猜,只有持有锁的线程才能退出它?
  • @aershov 如果您不需要读写器语义,您可以在此处使用 SemaphoreSlim。
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多