Какие операции ориентированы на многопотоковое исполнение на станд.:: карта?

Предположим, что я имею:

stl::map<std::string, Foo> myMap;

действительно ли следующая функция ориентирована на многопотоковое исполнение?

myMap["xyz"] ?

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


Все записано в однажды сначала.

Затем после этого, несколько потоков, считанных из него.

Я стараюсь избегать блокировок для создания этого как банкета как возможного. (yaya возможная преждевременная оптимизация я знаю),

14
задан Deduplicator 12 October 2018 в 02:20
поделиться

4 ответа

Теоретические контейнеры STL не являются нитей. На практике чтение безопасно, если контейнер не модифицирован одновременно. Т.е. стандарт не имеет спецификаций о нитках. Следующая версия стандарта WILL и IIUC она будет гарантировать безопасное поведение готовности.

Если вы действительно обеспокоены, используйте отсортированный массив с двоичным поиском.

11
ответ дан 1 December 2019 в 07:51
поделиться

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

Как отметил Макс С., в основном реализацию чтения элемента на карте, как MyMap [«XYZ»] не будет иметь операций записи. Если это так, то это безопасно. Но, еще раз, вы должны гарантировать, что нет нитей, которая модифицирует структуру, кроме фазы инициализации.

4
ответ дан 1 December 2019 в 07:51
поделиться

, по крайней мере, в реализации Microsoft, чтение от контейнеров является безопасным потоком (, ссылка ).

Однако STD :: Map :: Оператор [] может модифицировать данные и не объявлено const . Вы должны вместо этого использовать std :: map :: find , который const , чтобы получить const_iterator и развеять его.

6
ответ дан 1 December 2019 в 07:51
поделиться

Коллекции STL не Threadsafe, но это довольно просто добавить безопасность потоков в одну.

Ваш лучший ставка создает оболочку ThreadsAfe вокруг рассматриваемой коллекции.

1
ответ дан 1 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: