Безопасно ли перебирать неизменный словарь из нескольких потоков? - PullRequest
4 голосов
/ 10 декабря 2011

У меня есть такой код, который выполняется одновременно из нескольких потоков (над общими a и b объектами типа Dictionary<int, double>):

foreach (var key in a.Keys.Union(b.Keys)) {
    dist += Math.Pow(b[key] - a[key], 2);
}    

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

Ответы [ 2 ]

5 голосов
/ 10 декабря 2011

Из документации словарь :

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

Пока вы никогда не пишете, она должна быть безопасной.

4 голосов
/ 10 декабря 2011

Только если Вы гарантируете, что не пишет, происходит

Словарь (Of TKey, TValue) может поддерживать несколько читателей одновременно, пока коллекция не изменена. Даже так, перечисление через коллекцию изначально не является потокобезопасным процедура. В редком случае, когда перечисление конкурирует с записью доступы, коллекция должна быть заблокирована в течение всего перечисления. Разрешить доступ к коллекции из нескольких потоков для чтения и написание, вы должны реализовать свою собственную синхронизацию.

Для безопасной для потока альтернативы см. ConcurrentDictionary (Of TKey, TValue).

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

Источники

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