c++ - 对列表进行更改时,std::string 和 std::list 的 boost::unordered_map 中的线程安全

标签 c++ boost thread-safety unordered-map boost-unordered

我正在使用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/

相关文章:

thread-safety - lib magic 线程安全吗?

C++ fatal error LNK1120 : 1 unresolved externals

c++ - 为什么当内存足够时 malloc() 会失败?

c++ - 从 C++ 源代码创建类图?

C++ header 保持理智

c++ - 使用 cmake for arm 与静态链接的 boost 库交叉编译

c++ - Poco 任务管理器/Boost 线程混合和匹配

java - 当数据可用时,如何从 map 获取数据?