Безопасен ли поток доступа std :: map, если итераторы к нему никогда не становятся недействительными - PullRequest
2 голосов
/ 07 марта 2019

Итак, я хочу создать карту примерно так: std::map<std::string, std::atomic<bool>>. Мой вариант использования - некоторые проверки во время выполнения, чтобы увидеть, выполняются ли определенные условия (true или false); и я кеширую результат проверки условий на этой карте, так как эти проверки дороги.

Идея состоит в том, что я предварительно заполняю эту карту std::call_once, а затем никогда больше не удаляю и не вставляю элементы. Однако у меня был бы параллельный доступ к нему через find (), и эти обращения могли бы изменить значение std::atomic значений с помощью store (true).

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

1 Ответ

1 голос
/ 07 марта 2019

Безопасен ли поток доступа std :: map, если итераторы к нему никогда не аннулируются

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

Идея состоит в том, что я предварительно заполняю эту карту

Это кажется достаточным.Безопасно одновременно читать (находить, проходить и т. Д.) Стандартную карту из нескольких потоков, если ни один поток не изменяет ее.

, и эти обращения могут изменить значение std::atomic

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

...