在.Net中有什么类似ConcurrentSet的吗?

时间:2012-12-10 04:41:33

标签: .net concurrency thread-safety concurrentdictionary

我在.Net中使用了ConcurrentDictionary,并且爱上了使用它编写并发类是多么容易。

现在,我有一个不同的场景。我基本上需要在非重复的无序列表中跟踪单个对象类型,所以基本上是一个Set<T>类型的东西,除了它需要我期望{{1的所有线程安全性所以有ConcurrentDictionary之类的东西。

.Net中是否有这样的内容?

我考虑过只使用ConcurrentDictionary并且只担心密钥,而且从不使用该值,但这似乎非常不理想

1 个答案:

答案 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();
        }
    }