简体   繁体   中英

Does it risk if use c++ std::unordered_map like this?

Does it risk if use c++ std::unordered_map like this?

   std::unordered_map<std::string, std::unordered_set<std::shared_ptr<SomeType>>> _some_map;
   ...
   void init() {
       auto item = std::make_shared<SomeType>();
       _some_map["circle"].insert(item);
   }

_some_map is a member variable. init() function can be called only once, so insert is thread-safe. After initialization, the map will be read only in multi-thread. I think it is thread-safe too.

I'm not sure if I can use insert like this. Because it will make a unordered_set and a pair when there is no val of key "circle". The code works normally. Just want to make sure it is without potential risk.

(I am not good at English writing. )

Thank you.

I'm not sure if I can use insert like this.

Yes, you can, because operator[]

Returns a reference to the value that is mapped to a key equivalent to key, performing an insertion if such key does not already exist.

Your value_type is std::unordered_set which is default constructible, so there is no problem.

After initialization, the map will be read only in multi-thread

Here also you are safe, because according to the containers documentation

All const member functions can be called concurrently by different threads on the same container.

so if you are only reading the values without modifying them, it is OK. You could even perform write operations if you could guarantee that different threads are accessing different elements in your container.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM