Потокобезопасный словарь C # - PullRequest
3 голосов
/ 15 февраля 2012

Мой коллега недавно заявил, что несколько потоков чтения и записи могут обращаться к словарю c #, если вы не против получить устаревшие данные. Он оправдывался тем, что, поскольку программа будет повторно считывать данные из словаря, устаревшие данные не будут проблемой.

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

Я ошибаюсь?

Ответы [ 3 ]

8 голосов
/ 15 февраля 2012

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

.NET 4.0 добавляет ConcurrentDictionary<K,T> класс, который делает именно то, что подразумевает его имя.

1 голос
/ 15 февраля 2012

С http://msdn.microsoft.com/en-us/library/xfhwa508.aspx:

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

Для альтернативы, ориентированной на многопотоковое исполнение, см. ConcurrentDictionary<TKey, TValue>.

1 голос
/ 15 февраля 2012

Вы правы в том, что некоторая форма блокировки необходима для записи, хотя просто запись не означает, что вам нужно lock() { } каждый доступ к коллекции.

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

...