我在.Net中使用了ConcurrentDictionary
,并且爱上了使用它编写并发类是多么容易。
现在,我有一个不同的场景。我基本上需要在非重复的无序列表中跟踪单个对象类型,所以基本上是一个Set<T>
类型的东西,除了它需要我期望{{1的所有线程安全性所以有ConcurrentDictionary
之类的东西。
.Net中是否有这样的内容?
我考虑过只使用ConcurrentDictionary并且只担心密钥,而且从不使用该值,但这似乎非常不理想
答案 0 :(得分:0)
不,但您可以通过引用FSharp.Core.dll并使用Microsoft.FSharp.Collections创建线程安全集。
使用interlocked.CompareExhchange包装添加和删除。
性能因设定尺寸而异。但你应该能够处理数十万件物品。
这会处理大量读取和写入集合的线程。
“锁定”(不是真正的锁定,只是原子动作的区域)是围绕着线之间的所有内容:
initialSet = sharedSet;
和
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();
}
}