Словарь C # ‹T, K› потокобезопасность с одним записывающим устройством и несколькими программами чтения

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

Это то, что говорит MSDN.

Я не хочу использовать ConcurrentDictionary, если в этом нет необходимости

Я предполагаю, что если есть только один поток, выполняющий операции записи на Dictionary<T,K>, для других потоков безопасно выполнять простые операции чтения (например, TryGetValue не перечисление) одновременно без получения блокировки, я прав?


person Mr.Wang from Next Door    schedule 11.02.2015    source источник


Ответы (2)


Старый System.Collections.Hashtable безопасен для сценариев с несколькими читателями и одним писателем, то есть любое количество потоков может читать из Hashtable, но не более одного потока может изменять его одновременно. (Поток записи может безопасно изменять Hashtable, пока читатели читают из нее).

Общий Dictionary<T,K> небезопасен для таких сценариев - используйте ConcurrentDictionary<T,K> вместо этого.

Обратите внимание, что System.Collections.Hashtable и ConcurrentDictionary<T,K> используют совершенно разные реализации и предоставляют разные API. ConcurrentDictionary<T,K> хорошо подходит для таких сценариев, как отложенная инициализация и сквозной кэш. System.Collections.Hashtable является более производительным, поскольку это своего рода структура данных без блокировок, в то время как ConcurrentDictionary<T,K> использует синхронизацию потоков, маршалированную в Windows API.

person felix-b    schedule 11.02.2015

Я предполагаю, что если есть только один поток, выполняющий операции записи в Dictionary, для других потоков безопасно выполнять простые операции чтения (например, TryGetValue, а не перечисление) одновременно без получения блокировки

Нет. Ваше предположение неверно. Это безопасно только тогда, когда ни один писатель не изменяет словарь, а не когда у вас есть единственный писатель.

ReaderWriterLockSlim точно предназначен для использования в этом сценарии. При этом я бы просто использовал ConcurrentDictionary вместо изобретать колесо заново.

person Sriram Sakthivel    schedule 11.02.2015