C # многопоточное чтение немодифицируемых коллекций - PullRequest
5 голосов
/ 10 июля 2010

У меня есть словарь, который заполняется один раз в статическом конструкторе и остается неизменным с тех пор. Я хочу, чтобы несколько потоков могли читать значения из этой коллекции. Нужна ли здесь какая-либо блокировка?

Ответы [ 3 ]

14 голосов
/ 10 июля 2010

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

2 голосов
/ 10 июля 2010

Нет. Блокировка требуется только тогда, когда у вас есть возможность чередовать несколько записей или записей с чтениями. Только чтение, без каких-либо изменений, не дает возможности того, что один поток влияет на то, что делает другой поток.

Обратите внимание, что для этого вообще не требуется запись. Если, скажем, вы используете объект и, читая его, каким-то образом изменяете внутреннее состояние объекта как побочный эффект, то вам нужно будет по-прежнему блокировать.

1 голос
/ 10 июля 2010

Редактировать: Документы говорят, что этот класс является потокобезопасным для чтения.Но если ответ, приведенный ниже, по-прежнему применим, поскольку вы не можете предполагать, что только чтение доступно только для класса.


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

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

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

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

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