2013-02-11 50 views
4

关于ReaderWriterLockSlimReaderWriterLockSlim:一个可升级的锁之后获取读锁不会抛出LockRecursionException

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

我的观察结果:

  • 读者锁,然后读者锁 - >LockRecursionException
  • 读者锁,然后升级的读者锁 - >LockRecursionException
  • 读者锁,然后作家锁 - >LockRecursionException
  • 升级读者锁,然后读者锁 - >也不例外
  • 升级读者锁,然后升级读者锁 - >LockRecursionException
  • 可升级读卡器锁,然后写卡器锁 - >也不例外
  • 作家锁,然后读者锁 - >LockRecursionException
  • 作家锁,然后升级读者锁 - >LockRecursionException
  • 作家锁,然后作家锁 - >LockRecursionException

此行为是否正确?

回答

4

From the docs

在升级模式中的螺纹可以降级通过首先调用EnterReadLock方法,然后调用ExitUpgradeableReadLock方法来读取模式。所有锁定递归策略都允许使用此降级模式,即使是NoRecursion也是如此。

我的理解是,对于写作的情况下,进入一个写锁是从升级移动这么写模式的正常方式,所以必须要下NoRecursion政策甚至支持(有似乎小指向不可升级的可升级锁:)

+1

是的,这也是我的理解。这两条路径是正常的升级和降级场景。因此无论递归策略如何,都必须允许它们。我的困惑至少部分来自于我从来没有把它想象成_downgradeable_lock这个事实。 – 2013-02-11 12:23:33

+0

@JohnSloper不,我没有意识到它也可以降级。方便,但如果一个线程可以确定它不再需要写入。 – shambulator 2013-02-11 12:25:01

相关问题