首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ReaderWriterLock取代ReaderWriterLockSLim -故障

用ReaderWriterLock取代ReaderWriterLockSLim -故障
EN

Stack Overflow用户
提问于 2009-11-08 11:31:18
回答 2查看 5.6K关注 0票数 7

由于性能问题,我将ReaderWriterLock替换为ReaderWriterLockSlim。我遇到了麻烦,这是由于代码在使用RWL时正确地运行而引起的。

正如您所看到的,有时MethodA (它获取一个写锁)调用另一个方法(该方法获得一个读锁)。第二种方法也是从不同的地方调用的,所以并不总是会发生锁碰撞。以前,AcquiringRead锁不会导致这个问题。

除了放置"if IsRWheld“之外,还有其他解决方案吗?

问题是这样的:

代码语言:javascript
复制
class Avacado
{
   ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();

   void MethodA()
   {
      _lock.TryEnterWriteLock(-1);
         LockedList.Add(someItem)
         var result = MethodX();
      _lock.ExitWriteLock();
   }

   object MethodX()
   {
      //if called from MethodA, it will throw an exception
      _lock.TryEnterReadLock(-1);

      //...some stuff with LockedList...
      var result = LockList.Something();

      _lock.ExitReadLock();

      return result;
   }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-08 11:43:36

来自MethodX的MethodA调用将其限定为对锁的递归使用。

请参阅MSDN页面 for ReaderWriterLockSlim上的备注:

默认情况下,使用ReaderWriterLockSlim标志创建新的LockRecursionPolicy.NoRecursion实例,不允许递归。建议在所有新开发中使用此默认策略,因为递归会带来不必要的复杂情况,并使您的代码更容易陷入死锁。为了简化从使用监视器或ReaderWriterLock的现有项目的迁移,可以使用LockRecursionPolicy.SupportsRecursion标志创建允许递归的ReaderWriterLockSlim实例。

票数 9
EN

Stack Overflow用户

发布于 2012-10-18 20:10:34

ReaderWriterLock替换ReaderWriterLockSlim时要考虑的另一点是,后者实现IDisposable

这会使替换变得复杂--因为拥有ReaderWriterLockSlim的任何类型都必须是IDisposable

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1696096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档