Заблокируйте свободную неразмещающую коллекцию - PullRequest
0 голосов
/ 18 апреля 2019

Я ищу коллекцию структуру данных, которая:

  1. потокобезопасный
  2. без блокировки
  3. нераспределение (амортизация или предварительное распределение в порядке)
  4. ненавязчивый
  5. не использует экзотические свойства

Порядок элементов не имеет значения. Стек, очередь, сумка, все в порядке. Я нашел множество примеров, которые соответствуют четырем из этих пяти требований, например:

  • .NET Список не является потокобезопасным.
  • Если я добавлю к нему мьютекс, он не будет заблокирован.
  • .NET ConcurrentStack является потокобезопасным, без блокировок, использует простой CompareExchange, но выделяет новый Node для каждого элемента.
  • Если я переместу указатель next с Node на сам элемент, то это навязчиво.
  • Структуры данных без блокировки на основе массива , как правило, требуют многословных встроенных функций.

Я чувствую, что упускаю что-то супер очевидное. Это должно быть решенной проблемой.

1 Ответ

0 голосов
/ 18 апреля 2019
  • .NET ConcurrentQueue соответствует всем пяти требованиям.Он выделяется, когда резервному хранилищу не хватает места, как List<T>, но пока есть дополнительная емкость, выделения не происходят.К сожалению, единственный способ заранее зарезервировать дополнительную емкость - это инициализировать ее коллекцией того же размера, а затем удалить все элементы из очереди.
  • То же самое верно для ConcurrentBag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...