Безопасно ли читать несколько потоков из Lookup <TKey, TElement>? - PullRequest
5 голосов
/ 20 марта 2012

Безопасно ли читать несколько потоков из Lookup<TKey, TElement>?

Lookup<TKey, TElement> является неизменным, однако MSDN сообщает:

Любые открытые статические (Shared в Visual Basic) члены этого типа являются Поток безопасно. Любые члены экземпляра не гарантированно являются потоками сейф.

Хоть я и не могу себе представить, мне интересно, есть ли машина, которая выкачивает документацию MSDN? может быть неверным.

Ответы [ 4 ]

2 голосов
/ 20 марта 2012

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

1 голос
/ 20 марта 2012

Пока нет записи, выполнение только чтения является потокобезопасным.Это справедливо в любом случае.

Ваш вопрос в некотором смысле ортогональн к понятию безопасности потоков.Запись в сочетании с записью или чтением не является поточно-ориентированной, но множественное чтение без записи является поточно-ориентированным.

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

0 голосов
/ 20 марта 2012

Поскольку Lookup<TKey,TElement> является неизменным, это означает, что вы получите одинаковые значения для всех членов. Это не означает, что хранящиеся в нем предметы не могут быть изменены. Таким образом, коллекция действительно не является поточно-ориентированной. Прекрасным примером будет то, что большинство linq вычисляется лениво, а создание перечислителя может включать выполнение ленивого кода. Попытка перечисления в двух отдельных потоках может привести к тому, что коллекция будет реализована дважды, что приведет к неверному результату.

Обновление: Теперь, когда исходный код доступен на https://referencesource.microsoft.com, подтверждается, что внутреннее состояние устанавливается во время вызовов методов без учета многопоточности, что означает, что вы можете иметь условия гонки, а класс Lookup<TKey,TElement> фактически не является поточно-ориентированным.

0 голосов
/ 20 марта 2012

Это стандартный отказ от ответственности для всех большинства классов, как вы, вероятно, заметили. Некоторые методы могут быть поточно-ориентированными, но «не гарантированы».

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

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