Каков стандарт в настоящее время, когда нужен поточно-безопасный сбор (например, Set). Я сам его синхронизирую или есть встроенная потоковая коллекция?
Тематические коллекции в .NET.
Ответ 1
.NET 4.0 Framework представляет несколько потокобезопасных коллекций в System.Collections.Concurrent Namespace:
ConcurrentBag <T>
Представляет потокобезопасный, неупорядоченный набор объектов.ConcurrentDictionary < TKey, TValue >
Представляет собой потокобезопасную коллекцию пар ключ-значение, к которым одновременно можно обращаться несколькими потоками.ConcurrentQueue <T>
Представляет собой сборку первого потока в первом потоке (FIFO) с потоком.ConcurrentStack <T>
Представляет собой сборку последних вложений (LIFO), не связанных с потоком.
Другие коллекции в .NET Framework по умолчанию не являются потокобезопасными и должны быть заблокированы для каждой операции:
lock (mySet)
{
mySet.Add("Hello World");
}
Ответ 2
Pre.net 4.0 Большинство коллекций в .Net не являются потокобезопасными. Вам нужно будет выполнить некоторую работу самостоятельно, чтобы обработать синхронизацию: http://msdn.microsoft.com/en-us/library/573ths2x.aspx
Цитата из статьи:
Классы коллекций могут быть сделаны нитями безопасное использование любого из следующих Методы:
Создайте потокобезопасную оболочку, используя Синхронизированный метод и доступ к сбор только через это обертка.
Если класс не имеет Синхронизированный метод, полученный из класса и реализовать синхронизированный метод с использованием свойства SyncRoot.
Используйте механизм блокировки, например, блокировка в С# (SyncLock в Visual Basic), на SyncRoot при доступе к коллекция.
Sync Root Property
Заявление о блокировке
Object thisLock = new Object();
......
lock (thisLock)
{
// Critical code section
}
В .net 4.0 введено System.Collections.Concurrent пространство имен
Блокировка коллекции
Параллельная сумка
Параллельная очередность
Параллельный словарь
Разместимый Partitioner
Partitioner
Partitioner T
Ответ 3
.NET 4 предоставляет набор потокобезопасных коллекций в System.Collections.Concurrent
Ответ 4
В дополнение к очень полезным классам в System.Collections.Concurrent
, один стандартный метод в сценариях с большинством чтения-редко-изменения (или, если есть частые, но неконкурентные записи), которые также применимы к .Net Скопировать-на-запись.
Он имеет несколько свойств, которые желательны в высококонкурентных программах:
- сами экземпляры объектов коллекции являются неизменяемыми (то есть поточно-безопасными, можно безопасно перечислить без блокировки).
- может потребоваться столько времени, сколько потребуется, производительность и concurrency чтения не будут затронуты
- может быть реализован в целом, чтобы превратить любую структуру данных, которая не является потокобезопасной, в
Ограничение: если есть параллельные записи, возможно, придется повторить изменения, поэтому, чем больше одновременных записей, тем менее эффективными они становятся. (Что оптимистичный concurrency на работе)
Изменить. Комментарий Скотта Чемберлена напомнил мне, что есть еще одно ограничение: если ваши структуры данных огромны, а часто происходят изменения, то копирование-все-на-запись может быть непомерно как с точки зрения потребления памяти и стоимость процессора при копировании.