gpt4 book ai didi

c# - ReaderWriterLockSlim 与双锁检查模式

转载 作者:行者123 更新时间:2023-11-30 15:01:27 25 4
gpt4 key购买 nike

编辑: 从我已经得到的答案来看,我了解到我提出的第一个解决方案并不是真正的“不阻塞读取”,因为只有一个线程可以进入可升级锁而写锁不能在阅读发布之前采取...

所以我的问题是,如果不存在,如何以正确的方式使第一个解决方案成为“非阻塞读取”并创建?


我正在尝试了解非阻塞多线程读取的两种解决方案。以下两种解决方案之间有什么区别(也许我仍然不明白某些事情,但我正在尝试):

/// <summary>
/// ReaderWriterLockSlim pattern
/// </summary>
public class ReadWriteLockCheck
{
Dictionary<string, object> _dict = new Dictionary<string, object>();

private ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);

public void CreateByKey(string key)
{
_rwLock.EnterReadLock();
try
{
if (!_dict.ContainsKey(key)) //Non blocking read - Check if exists
{
_rwLock.EnterWriteLock(); //Lock
try
{
_dict.Add(key, new object());
}
finally
{
_rwLock.ExitWriteLock();
}
}
}
finally
{
_rwLock.ExitReadLock();
}
}

public bool GetByKey(string key)
{
_rwLock.EnterWriteLock();
try
{
if (_dict.ContainsKey(key)) //Non blocking read
{
return true;
}

return false;
}
finally
{
_rwLock.ExitReadLock();
}
}
}

/// <summary>
/// Double check lock pattern
/// </summary>
public class MonitorLock
{
Dictionary<string, object> _dict = new Dictionary<string, object>();

private object _syncObj = new Object();

public void CreateByKey(string key)
{
if (!_dict.ContainsKey(key)) //Non blocking read - Check if exists
{
Monitor.Enter(_syncObj); //Lock
try
{
if (!_dict.ContainsKey(key)) //Check if between first check and lock someone already added
{
_dict.Add(key, new object());
}
}
finally
{
Monitor.Exit(_syncObj);
}
}
}

public bool GetByKey(string key)
{
if (_dict.ContainsKey(key)) //Non blocking read
{
return true;
}

return false;
}
}

在我看来,这两种解决方案都可以进行非阻塞读取并且只在写入时阻塞...如果是这样,ReaderWriterLockSlim 有什么好处?正如我在 google 中发现的那样,MonitorReaderWriterLockSlim 快得多。我当然知道我在阅读时可能会得到不正确的字典状态,但这对我来说没关系。
谢谢

最佳答案

From MSDN :

Only one thread can enter upgradeable mode at any given time

基本上,您并没有比使用完全锁做得更好 - 除了 lock 实际上会更快。

奇怪的是,这里的一个好方法是Hashtable;特别是因为值是 object,而键是引用类型(没有额外的装箱)。 Hashtable 的不同寻常之处在于读取 是完全线程安全的;你只需要防范多个作者

例如:

readonly Hashtable lookup = new Hashtable();

...

object val = lookup[key]; // no need to synchronize when reading

...

lock(lookup)
{
lookup[key] = newVal; // synchronize when writing
}

关于c# - ReaderWriterLockSlim 与双锁检查模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14215502/

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