代码之家  ›  专栏  ›  技术社区  ›  Peter Wone

在.net中读取锁

  •  1
  • Peter Wone  · 技术社区  · 17 年前

    在任何不成熟的DBMS中,读锁和更新锁之间都有区别。在我的多线程C#代码中,到目前为止,我使用了 lock 关键字,但今天我意识到,如果我能在锁定中实现读写的区别,我的应用程序的性能会好得多;我有许多线程可以安全地同时阅读,但它们为了不经常但不可避免的写作而互相阻碍。

    我可以,而且我想我将不得不,实现我自己的锁定方案,在这种方案中,对写锁的请求既会暂停获取更多的读锁,也会暂停,直到现有的读锁被释放。

    我肯定不是第一个面对这种需要的人?外面有什么,特别是对C#来说?


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

    天哪,这在系统里。核心!别说了,德米特里,你让我觉得自己老了。

    我想知道游说微软提供类似于 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();
        }
      }
    ...
    

    这与监视器的显式使用非常相似。在微软的一点帮助下,它可以像这样干净和简单。

    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 回复  |  直到 17 年前
        1
  •  5
  •   Dmitri Nesteruk    17 年前