2

我使用了ConcurrentDictionaryin .Net 并爱上了使用它编写并发类是多么容易。

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

.Net中是否有类似的东西?

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

4

1 回答 1

0

不,但您可以通过引用 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();
        }
    } 
于 2013-02-20T00:24:10.547 回答