Безопасно ли читать один объект c ++ std :: map разными потоками одновременно без механизмов синхронизации? - PullRequest
1 голос
/ 27 сентября 2010

У меня есть глобальный объект, содержащий несколько объектов c ++ std :: map.Предполагается, что этот объект доступен только для чтения в многопоточной среде.Но я не уверен, есть ли какая-либо операция записи, когда объект C ++ std :: map читается в реализации std :: map.Средой разработки является Visual Studio 2008. Должен ли я предоставить некоторые механизмы синхронизации для операций чтения?

Ответы [ 4 ]

9 голосов
/ 27 сентября 2010

Да, все будет в порядке, если никто не пишет на карту.Подробные сведения см. Здесь.

Потоковая безопасность std :: map для операций только для чтения

2 голосов
/ 27 сентября 2010

Существует по крайней мере одна «портативная» проблема, заключающаяся в том, что если вы используете operator[] для чтения, это не обязательно операция только для чтения, поскольку, если элемент еще не существует на карте, он будетбыть создан.Помимо этого, это становится вопросом конкретной реализации.

0 голосов
/ 27 сентября 2010

См. здесь , чтобы узнать о специфике библиотеки std, которая поставляется с VC ++ 2008:

Один объект является потокобезопасным для чтение из нескольких потоков. За Например, учитывая объект A, это безопасно читать A из потока 1 и из одновременно резьба 2.

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

0 голосов
/ 27 сентября 2010

Если вы используете подстрочный оператор, то нет. Существует вероятность, что оператор индекса (map [1]) изменит структуру карты.

Однако, если вы используете метод find с const_iterators, это вполне безопасно. Просто помните, что все эти итераторы могут стать недействительными, если карта будет изменена.

С учетом сказанного, это, вероятно, все еще небезопасная идея.

...