gpt4 book ai didi

c# - 替代可移植类库的 ConcurrentDictionary

转载 作者:太空狗 更新时间:2023-10-29 17:56:17 26 4
gpt4 key购买 nike

我正在编写一个面向 .NET 4.5、Windows 应用商店应用程序和 Windows Phone 8 的可移植类库。我需要一个高效的内存缓存机制,所以我考虑使用 ConcurrentDictionary<K,V> , 但它在 WP8 中不可用。

将会有很多读取和相对较少的写入,所以理想情况下我想要一个支持多线程无锁读取和单线程写入的集合。非泛型 Hashtable具有该属性,according to MSDN , 但不幸的是它在 PCL 中不可用...

PCL 中是否有其他可用的集合类满足此要求?如果不是,那么在不锁定读取的情况下实现线程安全的好方法是什么? (锁定写入是可以的,因为它不会经常发生)


编辑:感谢 JaredPar 的指导,我最终以完全无锁的方式实现了我的缓存,使用 ImmutableDictionary<TKey, TValue>来自 Microsoft.Bcl.Immutable :

class Cache<TKey, TValue>
{
private IImmutableDictionary<TKey, TValue> _cache = ImmutableDictionary.Create<TKey, TValue>();

public TValue GetOrAdd(TKey key, [NotNull] Func<TKey, TValue> valueFactory)
{
valueFactory.CheckArgumentNull("valueFactory");

TValue newValue = default(TValue);
bool newValueCreated = false;
while (true)
{
var oldCache = _cache;
TValue value;
if (oldCache.TryGetValue(key, out value))
return value;

// Value not found; create it if necessary
if (!newValueCreated)
{
newValue = valueFactory(key);
newValueCreated = true;
}

// Add the new value to the cache
var newCache = oldCache.Add(key, newValue);
if (Interlocked.CompareExchange(ref _cache, newCache, oldCache) == oldCache)
{
// Cache successfully written
return newValue;
}

// Failed to write the new cache because another thread
// already changed it; try again.
}
}

public void Clear()
{
_cache = _cache.Clear();
}
}

最佳答案

要考虑的一个选择是在不可变搜索树上编写一个薄外观。 Web 上有几个不可变的搜索树可供选择。我通常基于 Eric Lipperts 关于该主题的精彩帖子

将其用作后备数据结构将使您无锁。对树的写入也可以使用 CAS 以无锁方式完成。这将比 ConcurrentDictionary 慢一点,因为查找是 O(Log(N)) 而不是接近 O(1)。但它应该对你有用

关于c# - 替代可移植类库的 ConcurrentDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18367839/

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