支持多线程的c++ HashMap



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

1-当新数据插入hashmap中时,整个hashmap不被锁定,并且允许其他线程读取和更新hashmap

中的其他键/值

2-多个键/值应该同时更新。例如,一个线程更新键x,而另一个线程更新键y。

这样的实现存在于c++ stl或其他库中吗?还是我需要自己写点什么?

我相信微软PPL实现的concurrent_unordered_map和英特尔TBB实现目前都有每个哈希本的锁。TBB还有一个语义略有不同的concurrent_hash_map。它们在规范中都不能保证一定数量的并发性,规范唯一保证的是没有数据竞争。

如果你的算法对并发哈希表写的性能如此敏感,那么你可能有麻烦了。在每次访问中获取和释放锁的成本与执行哈希表插入的成本相似。因此,由于锁定开销,您将损失一半的性能,并且需要更多的并行性来恢复它。您确定不能每个线程都有一个哈希表,然后在完成后合并所有哈希表吗?(有些算法会让你侥幸逃脱,有些则不然。)

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

最新更新