Без блокировки и многопоточный IList <T>для .NET - PullRequest
14 голосов
/ 21 февраля 2011

Существует ли не блокируемая и поточно-ориентированная структура данных, которая реализует IList?

Естественно, что под блокировкой я имею в виду реализацию, которая не использует блокирующие примитивы в .NET, а использует блокированные операции /атомарные операции для обеспечения безопасности потоков ... По-видимому, под параллельными структурами данных их нет ...

Кто-нибудь видел, чтобы кто-нибудь летал вокруг?

Я видел java-файл.реализован в амино-cbbs , называется LockFreeVector , но пока ничего для .NET.Есть идеи?

Ответы [ 3 ]

6 голосов
/ 26 февраля 2011

Ну, я нигде не мог найти такой класс;поэтому Я дал ему шанс .

Исходный код для моего ConcurrentList<T> класса доступен на GitHub .

Он не блокируется, не поддерживает потоки (я думаю , основываясь на моих модульных тестах) и реализует IList<T>.

Он поддерживает , а не Insert, RemoveAt / Remove или Clear.

Мне было приятно узнать, что моя реализация (которую я придумал независимо) очень похожа на реализацию структуры данных опубликовано некоторыми уважаемыми умами в мире программного обеспечения.

Для довольно краткого обсуждения самой реализации, см. мой недавний пост в блоге об этом.

На данный момент, это вообще не задокументировано, что довольно плохо, учитывая, насколько «хитрым» является некоторый код: (

И, конечно, вырвите мне новый, если возьметеискать и находить ошибки или другие проблемы.

В любом случае, возможно, стоит потратить время на то, чтобы проверить это. Если да, дайте мне знать, что вы думаете.

5 голосов
/ 22 февраля 2011

ConcurrentList, реализующий IList, может отсутствовать в пространстве имен Collections.Concurrent из-за целых Parallel.For и Parallel.ForEach методов класса.Можно сказать, что они могут использоваться для обработки любого списка как параллельного, чтобы быстро перечислять список и выполнять действия с его элементами.

Может быть, не предоставив ConcurrentList, они имели в виду или думали, что если Parralel.For не сможет помочь, потребуется использовать не IList, а какой-то другой вид коллекций, такой как стек или очередь, или даже Bag или даже Dictionary

Я бы согласился с этим дизайном, потому что работа с индексируемой коллекцией в условиях многопоточности звучит как очень подверженная ошибкам и плохая конструкция.Какова цель знания индекса элемента, если коллекция может быть изменена в любое время, и индекс будет признан недействительным, в таких случаях, когда есть несколько читателей - писателей, мне совершенно ясно, что очередь или стек обычно лучше всего подходят для коллекций, илиСумка тоже может быть хорошей.Словарь можно использовать также потому, что его индексы не становятся недействительными при добавлении элементов в коллекцию, и если вам нужен параллельный доступ к списку, вы получаете свои Parralel.For методы

То, что я считаю действительно странным - http://msdn.microsoft.com/en-us/library/dd381935.aspxздесь мы можем прочитать о классе ConcurrentLinkedList, но я не могу найти его в System.dll, там есть только Bag и BlockingCollection.

Я бы также сказал, что есть вероятность, по крайней мере, 95%, что любое из двух истинноВаша проблема

  1. Методы параллельного класса лучше, чем ConcurrentList
  2. Существующие коллекции Concurrent будут лучшими коллекциями, чем ConcurrentList

Я бы также сказал, чтоне предоставляя ConcurrentList, они спасли разработчиков, которые по ошибке выбрали ConcurrentList, чтобы решить свои проблемы, не допустив много ошибок, и сэкономили много времени, заставляя разработчиков использовать существующие коллекции Concurrent.

0 голосов
/ 26 февраля 2011

Подумайте, как может работать произвольный доступ (подразумеваемый IList<T>) в многопоточной среде.На самом деле вы ничего не сможете сделать, если это не будет неизменным, поскольку добавление и удаление, даже если они атомарные, не мешают потоку 1 удалить элемент по индексу, который поток 2 только собирался получить.Вот почему материал SyncRoot отсутствует в .NET 2.0 +

...