2

私はConcurrentDictionaryin .Net を使用しており、それを使用して並行クラスを作成するのがいかに簡単であるかに恋をしました。

今、私は別のシナリオを持っています。私は基本的に、重複していない順序付けられていないリストで単一のオブジェクト型を追跡する必要があるため、基本的にSet<T>型のことですがConcurrentDictionaryGetOrAdd.

このようなものは .Net に組み込まれていますか?

ConcurrentDictionary を使用するだけでキーだけを気にし、値を使用しないことを検討しましたが、これは非常に最適ではないようです

4

1 に答える 1

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();
        }
    } 
于 2013-02-20T00:24:10.547 に答える