2

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 容器替换怎么办?

谢谢。

4

2 回答 2

1

由于您只修改包含的对象,而不是 [unordered_]map 本身,因此您只需锁定该包含的对象。如果您将 更改list为另一个序列(例如,双端队列或向量),则应该保持不变 - 更改包含对象的类型不会改变您只是修改该包含对象,而不是包含它的映射的事实.

于 2012-08-17T20:46:59.090 回答
1

您不必在此处执行任何锁定。如果保证密钥已经存在,那么访问它们是一个不需要锁定的非变异操作(只要没有其他人在变异)。每个列表都是独立的——只要没有其他人同时访问myMap["Apple"],你就是黄金。当然,您可以简单地使用更适合该任务的东西,例如无锁列表,它可以从多个线程安全地变异,或者concurrent_unordered_map您可以在 TBB 或 PPL 中找到的 .

于 2012-08-17T20:50:27.587 回答