#collections #pool #intrinsics #lock-free
#Коллекции #Бассейн #встроенные #без блокировки
Вопрос:
Я ищу структуру данных коллекции, которая является:
- потокобезопасный
- замок свободен
- нераспределение (амортизированный или предварительно распределенный — это нормально)
- ненавязчивый
- не используя экзотические внутренние компоненты
Порядок элементов не имеет значения. Стопка, очередь, пакет — все в порядке. Я нашел множество примеров, которые удовлетворяют четырем из этих пяти требований, например:
- Список .NET не является потокобезопасным.
- Если я добавлю к нему мьютекс, то он не будет заблокирован.
- ConcurrentStack .NET является потокобезопасным, без блокировок, использует простой
CompareExchange
, но выделяет новыйNode
для каждого элемента. - Если я перемещаю
next
указатель сNode
самого элемента на сам элемент, то это становится навязчивым. - Структуры данных без блокировок на основе массивов, как правило, требуют встроенных элементов из нескольких слов.
Я чувствую, что упускаю что-то очень очевидное. Это должно быть решаемой проблемой.
Ответ №1:
- ConcurrentQueue .NET удовлетворяет всем пяти требованиям. Он выделяет, когда в резервном хранилище заканчивается место, аналогично
List<T>
, но пока есть дополнительная емкость, выделения не происходят. К сожалению, единственный способ зарезервировать дополнительную емкость заранее — это инициализировать ее с помощью коллекции того же размера, а затем удалить из очереди все элементы. - то же самое верно и для .Совпадающий пакет NET’s ConcurrentBag