C++中的并发哈希表

Concurrent hash table in C++

本文关键字:哈希表 并发 C++      更新时间:2023-10-16

在我的应用程序中,我基本上有多个执行插入的线程,并且大多数情况下有一个线程正在遍历映射并在满足某些条件时删除项目。我想使用并发结构的原因是,它会在代码中提供更细粒度的锁定,从队列中删除项目,这看起来与此类似,由于各种原因,包括线程可能会被抢占而持有锁。

Function_reap()
{
while(timetaken != timeoutTime)
{
my_map_mutex.lock();
auto iter = my_unordered_map.begin();
while(iter != my_unordered_map.end())
{
if(status_completed == iter->second.status)
{
iter = my_unordered_map.erase(iter);
}
}
my_map_mutex.unlock();
}
}

正在浏览英特尔 TBB(线程构建模块(的文档,更具体地说是concurrent_unordered_map文档 (https://software.intel.com/en-us/node/506171(,看看这是否适合我的应用程序,并看到了这段摘录。

说明concurrent_unordered_map 和 concurrent_unordered_multimap 支持并发插入和 遍历,但不是并发擦除。接口不可见 锁定。他们可能在内部持有锁,但从不打电话时 用户定义的代码。它们的语义类似于 std::unordered_map 和 std::unordered_multimap 分别,但以下情况除外:

  • 擦除和提取方法以 unsafe_ 为前缀,以指示它们不是并发安全的。
  • 为什么TBB不提供从地图中安全同步删除? 这是什么技术原因?
  • 如果我在这里还有其他选择怎么办?理想情况下,它绝对可以在Linux上运行,如果可能的话,可以移植到Windows上。

嗯,很难设计一个(有效(支持所有操作的解决方案。TBB具有支持并发插入,查找和迭代,但没有擦除的concurrent_unordered_map- 以及支持并发插入,查找和擦除,但没有迭代的concurrent_hash_map

还有其他几个库提供并发哈希映射,如libcds,或者我自己的xenium。

ATM xenium 包含两个并发哈希映射实现:

  • harris_michael_hash_map- 完全无锁;支持并发插入、擦除、查找和迭代。但是,铲斗的数量必须在施工时定义,之后无法调整。每个存储桶都包含一个项目的链接列表,这对缓存不是很友好。
  • vyukov_hash_map- 是一个非常快速的哈希映射,它使用细粒度锁定进行插入、擦除和迭代;查找操作是无锁的。但是,如果使用迭代器,则必须小心避免死锁(即,线程不应在持有迭代器时尝试插入或擦除密钥(。但是,存在需要迭代的擦除重载,因此您可以安全地删除迭代器指向的项。

我目前正在努力使xenium完全兼容Windows。