.net - .net 中的读取锁

标签 .net locking

在任何不成熟的 DBMS 中,读锁和更新锁之间都是有区别的。迄今为止,在我的多线程 C# 代码中,我已经使用了 lock 关键字,但今天我发现,如果我可以进行读取与写入,那么我的应用程序的性能会好很多锁定的区别;我有许多线程可以同时安全地读取,但由于不频繁但不可避免的写入,它们相互阻碍。

我可以,而且我想我必须实现我自己的锁定方案,其中对写锁的请求既会停止获取进一步的读锁,又会停止直到现有的读锁被释放。

这些都不是非常困难,并且所有这些都由 Date 和其他人在您想命名的任何数据库理论文本中进行了令人震惊的详细描述。

我肯定不是第一个遇到这种需求的人吧?那里有什么,特别是 C# 的?


谢谢你,德米特里。

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

天哪,这在 System.Core 中!别这样了,德米特里,你让我感觉自己老了。

我想知道游说 Microsoft 提供类似于 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 非常相似。在微软的一点帮助下,它可能会像这样干净和简单。

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);
}

最佳答案

看看ReaderWriterLockSlim类(或其旧版本,ReaderWriterLock)。该锁类区分读锁和写锁,允许您有多个读取者但只有一个写入者。

关于.net - .net 中的读取锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/720407/

相关文章:

c# - 如何使用需要 oauth、openid 的 MVC 5 编写 REST API

Mysql select for update - 它没有锁定目标行。我如何确保它确实如此?

java - 并发 HashMap : what's the point in locking updates only?

c - 简单的多线程程序段错误

c - 针对特定场景最好的Linux内核锁定机制是什么

java - WAR 文件的烦人的 Tomcat 问题

.net - 安装程序需要框架 4.0 - 但它已经安装

c# - 为 BackgroundWorker 设计接口(interface)

asp.net - .NET 的 HTML sanitizer

.net - 包 'Microsoft.EntityFrameworkCore.SqlServer'与项目中的 'all'框架不兼容