读取.net中的锁定

时间:2009-04-06 06:49:13

标签: .net locking

在任何超过一半的DBMS中,读锁和更新锁之间存在区别。在我的多线程C#代码中,到目前为止,我已经使用了lock关键字,但是今天我发现,如果我能在锁定中实现读取和写入区别,那么我的应用程序中的性能会好很多;我有许多线程可以同时安全地读取,但是为了不经常但不可避免的写入,它们互相阻碍。

我可以,而且我想我必须实现我自己的锁定方案,其中写锁定请求都会停止获取进一步的读锁定,并且在释放现有的读锁之前一直停止。

这一切都不是非常困难,并且所有这些都是通过日期和其他人在您想要命名的任何数据库理论文本中详细描述的细节来描述的。

当然,我不是第一个面对这种需求的人吗?那里有什么,尤其是C#?


谢谢你,德米特里。

我希望的另一件事是人们可能对您尝试过的任何图书馆的优点和缺点有任何经验和评论。

天哪,那是在System.Core中!停下来,德米特里,你让我感觉老了。

我想知道游说微软提供类似于lock (object) { ... }语法的语法糖的最实用方法是什么。

改编自MSDN样本

public class SynchronizedCache
{
  private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
  private Dictionary<int, string> innerCache = new Dictionary<int, string>();

  public string Read(int key)
  {
    cacheLock.EnterReadLock();
    try
    {
      return innerCache[key];
    }
    finally
    {
      cacheLock.ExitReadLock();
    }
  }

  public void Add(int key, string value)
  {
    cacheLock.EnterWriteLock();
    try
    {
      innerCache.Add(key, value);
    }
    finally
    {
      cacheLock.ExitWriteLock();
    }
  }
...

与Monitor的明确使用密切相关。在MS的帮助下,它可以像这样干净简单。

private Dictionary<int, string> innerCache = new Dictionary<int, string>();

public string Read(int key)
{
  readlock(innerCache) return innerCache[key];
}
public void Add(int key, string value)
{
  writelock (innerCache) innerCache.Add(key, value);
}

1 个答案:

答案 0 :(得分:5)

查看ReaderWriterLockSlim类(或其旧版本,ReaderWriterLock)。此锁定类区分读写锁定,允许您拥有多个读取器,但只有一个读取器。