在C ++中同步unordered_map

时间:2010-11-30 10:41:06

标签: c++ stl

我正在使用Boost中的unordered_map。是否有unordered_map的同步版本?这是因为我有相当多的unordered_map并且使用lock手动同步它会非常混乱。

感谢。

4 个答案:

答案 0 :(得分:7)

使用自动锁定来提供封装容器提供类似STL的接口(unordered_map也是如此)是不可能的,因为存在与检索迭代器和字符串内部位置相关的竞争条件,然后尝试在以后的操作中使用它们。如果您可以找到一些不太灵活的接口来满足您的需求,可能将任何复杂的操作放入单个锁定的函数调用中,那么您可以轻松地在容器周围包装一个线程安全的类来简化您的使用。

答案 1 :(得分:4)

你确定这是你需要的吗?

while (!stack.empty())
{
  Element const e = stack.top();


  stack.pop();
}

在单个线程中,此代码看起来正确。但是,如果您希望使用多线程,只需使用同步堆栈就不会削减它。

  

如果其他人在您测试空虚后弹出最后一个元素会怎样?

多线程有多个容器同步。也就是说,你可以试试TBB。

答案 2 :(得分:2)

使用Folly的AtomicHashmap

来自Github上的Folly's documentation

  

folly / AtomicHashmap.h引入了一个同步的UnorderedAssociativeContainer实现,专为在多线程环境中的极端性能(比tbb :: concurrent_hash_map快约2-5倍)和良好的内存使用属性而设计。查找和迭代是等待的,插入具有密钥级锁定粒度,内存开销最小,永久32位ID可用于引用每个元素。

虽然有一些limitations

答案 3 :(得分:1)

英特尔的Thread Building Blocks库有一个类tbb::concurrent_hash_map,它是一个无序映射,允许并发访问。在内部,它使用细粒度锁定方案实现,但基本结果是您可以在没有竞争条件的情况下访问它。