Тематические коллекции в .NET.

Каков стандарт в настоящее время, когда нужна поточная безопасность (например, Set). Я сам его синхронизирую, или существует ли assembly по streamобезопасности?

.NET 4.0 Framework представляет несколько streamобезопасных коллекций в пространстве имен System.Collections.Concurrent :

ConcurrentBag <Т>
Представляет streamобезопасный, неупорядоченный набор объектов.

ConcurrentDictionary
Представляет поточно-безопасную коллекцию пар ключ-значение, к которым одновременно можно обращаться несколькими streamами.

ConcurrentQueue <Т>
Представляет собой сборку первого streamа в первом streamе (FIFO).

ConcurrentStack <Т>
Представляет собой сборку последних вживую (LIFO).


Другие коллекции в .NET Framework по умолчанию не являются streamобезопасными и должны быть заблокированы для каждой операции:

lock (mySet) { mySet.Add("Hello World"); } 

Pre .net 4.0 Большинство коллекций в .Net не являются streamобезопасными. Вам нужно будет выполнить некоторую работу самостоятельно для обработки синхронизации: http://msdn.microsoft.com/en-us/library/573ths2x.aspx

Цитата из статьи:

Классы коллекций могут быть streamобезопасными с использованием любого из следующих способов:

Создайте streamобезопасную оболочку с использованием метода Synchronized и получите доступ к коллекции исключительно через эту оболочку.

Если class не имеет синхронного метода, выведите его из classа и реализуйте синхронный метод с использованием свойства SyncRoot.

Используйте механизм блокировки, такой как оператор блокировки в C # (SyncLock в Visual Basic), в свойстве SyncRoot при доступе к коллекции.

Корневое свойство синхронизации
Заблокировать

 Object thisLock = new Object(); ...... lock (thisLock) { // Critical code section } 

В .net 4.0 введено пространство имен System.Collections.Concurrent

Блокирующая коллекция
Параллельная сумка
Параллельная очередь
Совместный словарь
Оружейный разделитель
Разметка
Разделитель T

.NET 4 предоставляет набор поточно-безопасных коллекций в System.Collections.Concurrent

В дополнение к очень полезным classам в System.Collections.Concurrent , один стандартный метод в сценариях с большинством чтения-редко-изменения (или, если есть частые, но неконкурентные записи), которые также применимы к .Net, называется Копировать-на-записи .

Он обладает несколькими свойствами, которые желательны в высококонкурентных программах:

  • сами экземпляры объектов коллекции являются неизменяемыми (то есть поточно-безопасными, можно безопасно перечислить без блокировки)
  • модификация может занять столько времени, сколько потребуется, производительность и параллелизм чтения не затрагиваются
  • могут быть реализованы в общем случае, чтобы превратить любую структуру данных, которая не является streamобезопасной, в

Ограничение: если есть параллельные записи, возможно, придется повторить изменения, поэтому, чем больше одновременных записей, тем менее эффективными они становятся. (Это оптимистический параллелизм на работе)

Редактор комментария Скотта Чемберлена напомнил мне, что есть еще одно ограничение: если ваши структуры данных огромны, и часто происходят изменения, то копирование-все-на-запись может быть непомерно как с точки зрения потребления памяти, так и с затратами на копирование процессора.

  • Как работают servlets? Создание, сеансы, общие переменные и multithreading
  • Можно ли использовать статический экземпляр java.sql.Connection в многопоточной системе?
  • Java: как масштабировать streamи в соответствии с ядрами процессора?
  • Timeout Pattern - насколько плох Thread.Abort действительно?
  • Является ли реализация Meyers streamом шаблонов Singleton безопасным?
  • Получение списка активных активных streamов в .NET?
  • Выполнить одновременно два windows winform
  • Как периодически выполнять метод из клиентского приложения WPF с помощью streamовой передачи или таймера
  • Проверка на нуль до отправки события ... streamобезопасная?
  • Безопасно ли просто устанавливать CheckForIllegalCrossThreadCalls на false, чтобы избежать ошибок сквозной streamовой передачи во время отладки?
  • OpenMP set_num_threads () не работает
  • Давайте будем гением компьютера.