C++中的并发哈希表
Concurrent hash table in C++
在我的应用程序中,我基本上有多个执行插入的线程,并且大多数情况下有一个线程正在遍历映射并在满足某些条件时删除项目。我想使用并发结构的原因是,它会在代码中提供更细粒度的锁定,从队列中删除项目,这看起来与此类似,由于各种原因,包括线程可能会被抢占而持有锁。
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。
相关文章:
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- C++中的并发哈希表
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 调整大小和复制哈希表数组中的元素
- 带链接的基本哈希表
- C++哈希表中,两个相同的实现,但一个给出错误
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 查找项目在哈希表中的位置
- 为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 使用哈希表设置实现
- 同时写入和读取哈希表
- 在 C++ 中为特定哈希表创建插入函数
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 哈希表:船舶记录
- 在没有"线程管理"的情况下C++设置并发哈希表/哈希?
- 如何用tbb实现一个将键映射到不同类型值的并发哈希表