Подтвердить что ты не робот

Можно ли одновременно читать словарь?

Имеется тип ConcurrentDictionary для одновременной операции чтения и записи. Поскольку в моем сценарии есть только операция чтения, мне интересно, можно ли просто использовать словарь?

И btw, как ConcurrentDictionary обслуживает R/W несколькими потоками? Использует ли он какой-то замок неявно, чтобы сделать все операции R/W сериализованными?

4b9b3361

Ответ 1

Можно ли одновременно читать словарь?

Чтение прекрасного руководства дает:

Dictionary<TKey, TValue> Класс

Безопасность резьбы

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

Для модификаций и операций записи в словарь ConcurrentDictionary использует мелкозернистую блокировку для обеспечения безопасности потоков. (Операции чтения в словаре выполняются без блокировки.)

Что касается:

как ConcurrentDictionary обслуживает R/W несколькими потоками?

Чтение прекрасного руководства дает:

ConcurrentDictionary<TKey, TValue> Class

Примечания

Для модификаций и операций записи в словарь ConcurrentDictionary использует мелкозернистую блокировку для обеспечения безопасности потоков. (Операции чтения в словаре выполняются без блокировки.)

Ответ 2

Да, чтение a Dictionary одновременно является вполне допустимой операцией. Согласно разделу безопасности потока документации,

A Dictionary<TKey,TValue> может поддерживать несколько считывателей одновременно, пока сбор не изменяется.

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

как ConcurrentDictionary обслуживает R/W несколькими потоками?

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