2013-03-12 6 views
0

Когда у меня есть несколько потоков, которые должны работать одновременно с коллекцией, я обычно использую коллекции под номером System.Collections.Concurrent.
Однако эти коллекции дороже по сравнению с их несогласованными аналогами. Интересно, могу ли я в некоторых случаях безопасно заменить их не совпадающими коллекциями.Когда я могу заменить параллельную коллекцию на стандартную коллекцию?

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

В таком случае было бы безопасно использовать Dictionary<TKey, TValue>, или мне еще нужно использовать ConcurrentDictionary<TKey, TValue>?

И в общем случае могу ли я предположить, что все стандартные коллекции поддерживают несколько считывателей, пока коллекция не изменяется?

ответ

2

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

Да, это безопасно чтения из Dictionary<,> из нескольких потоков, до тех пор, пока не не писателей. Вы должны убедиться, что между последней записью и первым чтением существует барьер памяти, но если вы создаете нитки после заполнения, это не должно быть проблемой.

Из documentation:

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

+0

Является ли общим правилом для всех коллекций, что мы можем иметь несколько параллельных считывателей, если мы не модифицируем коллекцию? Или это специальное свойство словаря '? –

+0

@AmirGonnen: Это, по крайней мере, очень распространено. Это стоит проверить, но наиболее распространенные коллекции в .NET имеют это свойство. –

+0

Хорошо, давайте возьмем 'HashSet ' например. В документации ничего не говорится об этом. Имеет ли смысл предполагать, что это работает как «Словарь », и допускаются одновременные чтения? –

Смежные вопросы