您好我需要在我的方法中使用writerreaderlock。我想知道如何正确使用它。
我收到了ObjectA的词典
public class ObjectA
{
public ReaderWriterLock RWL {get;set;}
public ObjectB obj {get;set;}
public ObjectA()
{
RWL = new ReaderWriterLock();
}
}
public class ObjectB
{
int TTL {get;set;}
string Value {get;set;}
}
在我的方法中,我使用ObjectA的字典,键是Guid,所以假设当我调用dict [guid]时它总是返回我的ObjectA的一个实例(例如)
public foo()
{
ObjecA objA = dict[guid];
objA.RWL.AcquireReaderLock(500);
if(objA.obj.TTL<=0)
{
objA.obj.RWL.AcquireWriterLock(1000);
objA.obj.Value = DateTime.Now().ToString();
objA.obj.RWL.ReleaseWriterLock();
}else{
int ttl = objA.obj.TTL;
Interlocked.Decrement(ref ttl);
}
objA.RWL.ReleaseReaderLock();
}
我真的不确定我在那边使用读者和作者,我是如何使用读写器锁来进行条件验证的呢?
答案 0 :(得分:6)
此代码存在许多问题,包括:
Interlocked.Decrement(ref objA.obj.TTL)
是如何正确执行此操作的。也值得考虑你是否确实需要使用读/写锁,而不是使用像lock{}
statement这样简单的东西。即使对于那些熟悉这些API和概念的开发人员来说,即使在那时他们通常只保留用于性能最关键的地方(1000秒+每秒),也很难获得正确的读取器/写入器锁定并避免死锁。换句话说,使用lock{}
开始使用更简单的方法可能会更好,如果性能不可接受,则只能使用ReaderWriterLockSlim
。
作为一个起点,我建议您在问题中添加更多信息:
我向您保证,如果您在问题中包含此附加信息,您将获得更好的答案,可以帮助您解决任何剩余的代码问题。 : - )