Нужно ли защищать одновременный доступ только для чтения к коллекциям .net? - PullRequest
0 голосов
/ 19 мая 2018

Имея коллекцию .net (словарь), которая потенциально может видеть очень высокий одновременный доступ только для чтения, нужно ли его защищать, что означает, что я должен использовать поточно-ориентированную версию коллекции или использовать механизмы синхронизации илиПоток безопасности темы только при наличии одновременных операций чтения и записи?

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

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

ConcurrentDictionary<TKey, TValue> реализует интерфейсы IReadOnlyCollection<T> и IReadOnlyDictionary<TKey, TValue>, начиная с .NET Framework 4.6;в предыдущих версиях .NET Framework класс ConcurrentDictionary не реализовывал эти интерфейсы.

Все операции этого класса являются атомарными и потокобезопасными. Единственными исключениями являются методы, которые принимают делегат, то есть, AddOrUpdate и GetOrAdd.

Для модификаций и операций записи в словарь, ConcurrentDictionary<TKey, TValue> использует мелкозернистую блокировку для обеспечения безопасности потока.

Операции чтения в словаре выполняются без блокировок .

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

0 голосов
/ 19 мая 2018

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

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

.NET Framework предлагает пакет Immutable Collections для обеспечения этого потока выполнения.Вы создаете свою неизменную коллекцию заранее, и тогда ваш код не может изменить ее даже непреднамеренно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...