我正在使用boost::unordered_map<const std::string, std::list<TypeA> >
在性能关键的多线程环境中。我知道写入 STL 容器不是线程安全的,boost::unordered_map
也是如此。 。
boost::unordered_map<const std::string, std::list<TypeA> > myMap;
// Added some elements to myMap
现在,如果我想向列表中添加或删除 A 类型的元素,是否有必要锁定整个映射,而不是锁定正在修改的列表,以便其他线程可以读/写其余的键值对?
// Assuming there are pair with the keys "Apple" and "Orange" in myMap
A a, b;
myMap["Orange"].push_back(a) //Add an element to the list
myMap["Apple"].remove(b); //Remove an element
如果列表被另一个 STL 容器替换怎么办?
谢谢。
最佳答案
由于您仅修改包含的对象,而不是 [unordered_]map 本身,因此您只需锁定该包含的对象即可。如果您将 list
更改为另一个序列(例如,双端队列或 vector ),则同样的情况应该保持不变 - 更改所包含对象的类型不会改变您只是修改所包含对象的事实对象,而不是包含它的 map 。
关于c++ - 对列表进行更改时,std::string 和 std::list 的 boost::unordered_map 中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12012866/