你好,我需要在我的方法中使用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,所以假设当我调用dictguid时,它总是返回我的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();
}我真的不确定我在那里使用的读取器和写入器,我怎么需要使用条件验证的读取器和写入器锁?
发布于 2009-11-05 02:00:42
这段代码有很多问题,包括:
Interlocked.Decrement(ref objA.obj.TTL)是如何做到这一点的,而不是设置一个初始的TTL值,所以它始终是零(除非其他代码正在设置它,对于一个线程敏感的类来说,这可能是不明智的,因为您通常希望同一个类中所有与线程安全相关的代码,以避免忘记谁在做什么)同样值得考虑的是,你是否真的需要使用读/写器锁,而不是使用像lock{} statement这样更简单的锁。即使对于非常熟悉这些API和概念的开发人员来说,获得正确的读取器/写入器锁并避免死锁也是很困难的,即使这样,他们通常也只在性能最关键的地方使用(每秒1000+)。换句话说,您最好从使用lock{}的更简单的方法开始,只有在性能不能接受的情况下才使用ReaderWriterLockSlim。
作为起点,我建议你在你的问题中添加更多的信息:
我向你保证,如果你在你的问题中包含这些额外的信息,你会得到更好的答案,这可以帮助你解决任何剩余的代码问题。:-)
https://stackoverflow.com/questions/1674426
复制相似问题