像这样使用c++ std::unordered_map会有风险吗?
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是一个成员变量。Init()函数只能被调用一次,所以insert是线程安全的。初始化后,映射将只能在多线程中读取。我认为它也是线程安全的。
我不确定我是否可以像这样使用insert。因为它会生成一个unordered_set和一对当没有val of key "circle"时。代码工作正常。我只是想确保它没有潜在的风险。
(我不擅长英语写作。)
谢谢。
我不确定是否可以这样使用insert
可以,因为操作符[]
返回映射到key的值的引用,如果该键不存在则执行插入操作。
您的value_type
是std::unordered_set
,它是默认可构建的,所以没有问题。
初始化后,map将在多线程中只读
这里也是安全的,因为根据容器文档
所有const成员函数可以由同一容器上的不同线程并发调用。
所以如果你只是读取值而不修改它们,那是可以的。如果你能保证不同的线程访问容器中的不同元素,你甚至可以执行写操作。