如何正确使用readwriterlock
您好,我需要在我的方法中使用 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();
}
我真的不确定我在那里使用读取器和写入器,我需要如何使用读取器写入器锁并进行条件验证?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这段代码有很多问题,包括:
Interlocked.Decrement(ref objA.obj.TTL)
是如何正确执行此操作的方法。还可能值得考虑您是否真的需要使用读取器/写入器锁,而不是使用像
锁定{}
语句。即使对于非常了解这些 API 和概念的开发人员来说,正确获取读取器/写入器锁定并避免死锁也是很困难的,即使如此,他们通常也只将其用途保留在对性能最关键的地方(每秒 1000 个以上)。换句话说,您可能最好从使用lock{}
的更简单方法开始,只有在性能不可接受时才重新使用ReaderWriterLockSlim
。作为起点,我建议您在问题中添加更多信息:
我向您保证,如果您在问题中包含此附加信息,您将获得更好的答案,这可以帮助您解决任何剩余的代码问题。 :-)
There are many problems with this code, including:
Interlocked.Decrement(ref objA.obj.TTL)
is how to do this properly.It also may be worth considering whether you really, really need to use reader/writer locks, instead of using something simpler like the
lock{}
statement. Getting reader/writer locks right and avoiding deadlocks is hard even for developers who know these APIs and concepts really well, and even then they usually reserve their use for only the most performance-critical places (1000's+ per second). In other words, you may be better off starting out with a simpler approach usinglock{}
, and only falling back to usingReaderWriterLockSlim
if performance is not acceptable.As a starting point, I'd suggest you add some more info to your question:
I guarantee you that if you include this addiitonal info in your question, you'll get better answers which can help you out with any any remaining code issues. :-)