在任何不成熟的 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/