我使用了ConcurrentDictionary
in .Net 并爱上了使用它编写并发类是多么容易。
现在,我有一个不同的场景。我基本上需要跟踪非重复无序列表中的单个对象类型,所以基本上是一个Set<T>
类型的东西,除了它需要我所期望的所有线程安全性ConcurrentDictionary
,所以有类似GetOrAdd
.
.Net中是否有类似的东西?
我考虑过只使用 ConcurrentDictionary 并且只担心密钥,而从不使用值,但这似乎非常不理想
我使用了ConcurrentDictionary
in .Net 并爱上了使用它编写并发类是多么容易。
现在,我有一个不同的场景。我基本上需要跟踪非重复无序列表中的单个对象类型,所以基本上是一个Set<T>
类型的东西,除了它需要我所期望的所有线程安全性ConcurrentDictionary
,所以有类似GetOrAdd
.
.Net中是否有类似的东西?
我考虑过只使用 ConcurrentDictionary 并且只担心密钥,而从不使用值,但这似乎非常不理想
不,但您可以通过引用 FSharp.Core.dll 并使用 Microsoft.FSharp.Collections 创建线程安全集。
只需使用 interlocked.CompareExhchange 包装添加和删除。
性能随集合大小而变化。但是你应该能够处理几十万套物品。
这处理大量线程读取和写入集合。
此外,“锁”(不是真正的锁,只是原子动作的区域)围绕着两行之间的所有内容:
初始集 = 共享集;
和
done = (initialSet == Interlocked.CompareExchange(ref sharedSet, newSet, initialSet));
FSharpSet<MyClass> _myItems;
InterLockedSetAdd(ref _myItems, Item);
public static void InterLockedSetAdd<T>(ref FSharpSet<T> sharedSet, T item)
{
FSharpSet<T> initialSet;
FSharpSet<T> newSet;
var spin = new SpinWait();
bool done = false;
while (!done)
{
initialSet = sharedSet;
newSet = sharedSet.Add(item);
done = (initialSet == Interlocked.CompareExchange(ref sharedSet, newSet, initialSet));
if (!done) spin.SpinOnce();
}
}