首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用readerwriterlock

如何正确使用readerwriterlock
EN

Stack Overflow用户
提问于 2009-11-04 23:13:00
回答 1查看 3.8K关注 0票数 2

你好,我需要在我的方法中使用writerreaderlock。我想知道如何正确使用它。

我有一本ObjectA的字典

代码语言:javascript
复制
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的一个实例(例如)

代码语言:javascript
复制
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();
}

我真的不确定我在那里使用的读取器和写入器,我怎么需要使用条件验证的读取器和写入器锁?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-05 02:00:42

这段代码有很多问题,包括:

  • 您实际上并没有递减类实例中的TTL --正如Nikolai所指出的,您是在递减一个局部变量!Interlocked.Decrement(ref objA.obj.TTL)是如何做到这一点的,而不是设置一个初始的TTL值,所以它始终是零(除非其他代码正在设置它,对于一个线程敏感的类来说,这可能是不明智的,因为您通常希望同一个类中所有与线程安全相关的代码,以避免忘记谁在做什么)
  • 您应该使用ReaderWriterLockSlim,它现在比旧的ReaderWriterLock类更受欢迎。请参阅后面的超链接了解原因。
  • 获取写锁时,如果已经有读锁,则需要升级锁--通常在lock类上有一个单独的方法来实现这一点。类似地,在升级之后,释放锁需要使用一种方法来释放锁,而不是使用一种方法来释放写锁,而不是使用另一种方法来释放以前的读锁。
  • 您需要处理无法获取锁的失败情况。
  • 您需要将代码包装在usingtry/finally块中,以确保即使发生异常也能释放资源。

同样值得考虑的是,你是否真的需要使用读/写器锁,而不是使用像lock{} statement这样更简单的锁。即使对于非常熟悉这些API和概念的开发人员来说,获得正确的读取器/写入器锁并避免死锁也是很困难的,即使这样,他们通常也只在性能最关键的地方使用(每秒1000+)。换句话说,您最好从使用lock{}的更简单的方法开始,只有在性能不能接受的情况下才使用ReaderWriterLockSlim

作为起点,我建议你在你的问题中添加更多的信息:

  • 首先,包括对您尝试执行的操作的高级描述,包括对功能和性能的高级要求。这可以帮助我们推荐正确的解决方案,并知道读取器/写入器锁定是否是用伪代码或简单易懂的英语编写的正确approach.
  • try,包括您希望如何解决上面的逻辑问题(例如,发生超时时如何处理,如何设置TTL等)
  • 修改您的代码示例,以包含我在上面提到的一些/所有问题的修复

我向你保证,如果你在你的问题中包含这些额外的信息,你会得到更好的答案,这可以帮助你解决任何剩余的代码问题。:-)

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

https://stackoverflow.com/questions/1674426

复制
相关文章

相似问题

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