具有多线程支持的C ++ HashMap

时间:2013-05-17 07:55:25

标签: c++ multithreading hashmap

我需要在C ++中使用HashMap / HashTable实现,我有以下要求

1-当在hashmap中插入新数据时,不会锁定完整的hashmap,并允许其他线程读取并更新hashmap中的其他键/值

2-多个键/值应该可以同时更新。即一个线程更新密钥x而另一个线程更新密钥y。

这样的实现是否存在于C ++ stl或其他任何库中?还是我需要自己写一些东西?

1 个答案:

答案 0 :(得分:1)

我认为concurrent_unordered_mapIntel TBB implementation的Microsoft PPL实现目前都有每个哈希bin的锁定。 TBB的语义也略有不同concurrent_hash_map。它们都没有保证其规范中的任何数量的并发性。规范唯一保证的是缺少数据竞争。

如果您的算法对并发哈希表写入的性能敏感,那么您可能会遇到麻烦。在每次访问时获取和释放锁的成本与执行散列表插入的成本类似。因此,您将失去一半的性能来锁定开销,并需要更多的并行性来恢复它。您确定每个线程都没有哈希表,然后在完成后合并所有哈希表吗? (有些算法可以让你逃避,其他算法则不会。)

修改:我刚刚注意到您要求能够同时更新密钥。在我所知道的任何并发哈希表实现下,这根本不可能。原因是这是一个读取 - 修改 - 更新操作,正如@JoopEggen指出的那样,它不适用于并发容器类型。实际上,这是一个read-modify-update-modify-update操作。为了修改键,您需要使整个操作序列成为原子。并发容器类型是监视器:每个单独的方法调用可以是原子的,但它们的序列不是。