gpt4 book ai didi

c# - EnterUpgradeableReadLock 和 EnterReadLock 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 13:07:47 25 4
gpt4 key购买 nike

当我阅读 C# 多线程时,我对 EnterReadLock 和 EnterUpgradeableReadLock 之间的区别感到困惑在下面的代码中,是否可以将 cacheLock.EnterUpgradeableReadLock() 替换为 cacheLock.EnterReadLock()?

private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
private Dictionary<int, string> innerCache = new Dictionary<int, string>();
public AddOrUpdateStatus AddOrUpdate(int key, string value)
{
//can there be cacheLoack.EnterReadLock?
cacheLock.EnterUpgradeableReadLock();
try
{
string result = null;
if (innerCache.TryGetValue(key, out result))
{
if (result == value)
{
return AddOrUpdateStatus.Unchanged;
}
else
{
cacheLock.EnterWriteLock();
try
{
innerCache[key] = value;
}
finally
{
cacheLock.ExitWriteLock();
}
return AddOrUpdateStatus.Updated;
}
}
else
{
cacheLock.EnterWriteLock();
try
{
innerCache.Add(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
return AddOrUpdateStatus.Added;
}
}
finally
{
cacheLock.ExitUpgradeableReadLock();
}
}

最佳答案

如果要升级为写锁,则必须是可升级锁。

为什么不总是使用可升级的锁呢?缺点是什么?这:

Only one thread can enter upgradeable mode at any given time. (https://learn.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlockslim.enterupgradeablereadlock?view=netframework-4.8)

这是您代码中的一个严重问题。因为你总是在这种模式下锁定,即使只是阅读你有效地单线程访问数据结构。实际上,它根本不再是读写锁。

我了解您的意图是在常见读取情况下允许并发,同时在写入情况下实现安全。也许最简单的解决方法是首先尝试以读取模式从缓存中读取。如果需要写入,则完全退出锁定并在可升级模式或直接在写入模式下重试。这样快速路径具有并发性。

也就是说,我想知道 ReaderWriterLockSlim 具有什么样的现实世界可扩展性。您锁定的代码区域非常便宜。锁的内部数据结构可能会发生竞争,所有可扩展性都可能被破坏。它最终可能与 Monitor/lock 一样快或慢。

ConcurrentDictionary 旨在跨键横向扩展。这可能是要走的路。

关于c# - EnterUpgradeableReadLock 和 EnterReadLock 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55966938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com