Есть ли что-то вроде ConcurrentSet в .Net?

Я использовал ConcurrentDictionary в .Net и влюбился в то, как легко с его помощью писать параллельные классы.

Но у меня другой сценарий. В основном мне нужно отслеживать один тип объекта в недублированном неупорядоченном списке, поэтому в основном вещь типа Set<T>, за исключением того, что она требует всей потокобезопасности, которую я ожидаю от ConcurrentDictionary, поэтому иметь такие вещи, как GetOrAdd .

Есть ли что-то подобное встроенное в .Net?

Я думал только об использовании ConcurrentDictionary и беспокоился только о ключе и никогда не использовал значение, но это кажется очень неоптимальным.


person Earlz    schedule 10.12.2012    source источник
comment
Возможный дубликат: stackoverflow.com/questions/ 4306936/   -  person rossipedia    schedule 10.12.2012


Ответы (1)


Нет, но вы можете создать потокобезопасный набор, ссылаясь на 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();
        }
    } 
person Jason Hernandez    schedule 20.02.2013
comment
Зачем использовать FSharpSet? Почему бы не использовать HashSet из System.Collections.Generic? - person Jeff Yates; 10.07.2014