由于性能问题,我将ReaderWriterLock替换为ReaderWriterLockSlim。我遇到了麻烦,这是由于代码在使用RWL时正确地运行而引起的。
正如您所看到的,有时MethodA (它获取一个写锁)调用另一个方法(该方法获得一个读锁)。第二种方法也是从不同的地方调用的,所以并不总是会发生锁碰撞。以前,AcquiringRead锁不会导致这个问题。
除了放置"if IsRWheld“之外,还有其他解决方案吗?
问题是这样的:
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;
}
}发布于 2009-11-08 11:43:36
来自MethodX的MethodA调用将其限定为对锁的递归使用。
请参阅MSDN页面 for ReaderWriterLockSlim上的备注:
默认情况下,使用ReaderWriterLockSlim标志创建新的
LockRecursionPolicy.NoRecursion实例,不允许递归。建议在所有新开发中使用此默认策略,因为递归会带来不必要的复杂情况,并使您的代码更容易陷入死锁。为了简化从使用监视器或ReaderWriterLock的现有项目的迁移,可以使用LockRecursionPolicy.SupportsRecursion标志创建允许递归的ReaderWriterLockSlim实例。
发布于 2012-10-18 20:10:34
用ReaderWriterLock替换ReaderWriterLockSlim时要考虑的另一点是,后者实现IDisposable。
这会使替换变得复杂--因为拥有ReaderWriterLockSlim的任何类型都必须是IDisposable。
https://stackoverflow.com/questions/1696096
复制相似问题