ReaderWriterLockSlim:在可升级锁不会抛出LockRecursionException之后获取读锁

时间:2013-02-11 11:56:38

标签: .net multithreading concurrency synchronization

关于ReaderWriterLockSlim

随后在相同线程中获取两个锁实际上应该抛出LockRecursionException(递归策略设置为NoRecursion)。

我的观察结果:

  • reader lock,然后 reader lock - > LockRecursionException
  • 阅读器锁定,然后可升级阅读器锁定 - > LockRecursionException
  • reader lock,然后 writer lock - > LockRecursionException
  • 可升级阅读器锁定,然后阅读器锁定 - > 不例外
  • 可升级阅读器锁定,然后可升级阅读器锁定 - > LockRecursionException
  • 可升级读卡器锁,然后编写器锁定 - > 不例外
  • writer lock,然后 reader lock - > LockRecursionException
  • writer 锁定,然后可升级读者锁定 - > LockRecursionException
  • writer lock,然后 writer lock - > LockRecursionException

这种行为是否正确?

1 个答案:

答案 0 :(得分:4)

From the docs

  

处于可升级模式的线程可以通过先调用EnterReadLock方法然后调用ExitUpgradeableReadLock方法降级到读取模式。所有锁定递归策略都允许使用此降级模式,甚至是NoRecursion

我的理解是,对于写入情况,进入写锁定是无论如何从可升级到写入模式的正常方式,因此即使在{{1}的策略下也必须支持(对于不可升级的可升级锁似乎没什么意义:)