C# многопоточное чтение немодифицируемых наборов

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

5
задан Primary Key 10 July 2010 в 13:35
поделиться

3 ответа

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

14
ответ дан 18 December 2019 в 09:47
поделиться

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

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

2
ответ дан 18 December 2019 в 09:47
поделиться

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


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

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

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

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

1
ответ дан 18 December 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: