TBB 并发哈希映射查找和插入
tbb concurrent hash map find & insert
我目前正在使用tbb的并发哈希映射来执行对哈希映射的并发插入。每个键是一个字符串,值是一个整数向量。我想实现以下目标:在插入期间,如果键不存在,我插入它并将值添加到它的向量。如果存在,则简单地将值添加到它的向量中。
在检查了tbb并发散列映射API之后,我注意到find和insert函数都只返回布尔值。如果键存在,如何返回指向键的指针?
有些方法需要在其参数中使用访问器。访问器基本上是一个指针加上一个scoped_lock
来保护对元素的并发访问。如果没有锁,可以并发地修改元素,从而导致数据竞争。因此,永远不要直接使用concurrent_hash_map中的元素指针(除非受到访问器的保护)。
同样,您不需要find()
方法为您的任务,因为insert()
方法创建的元素,如果它不存在。
根据参考手册,哈希映射有以下方法可能会满足您的需求:
bool insert( accessor& result, const Key& key ); // creates new element by default
bool insert( accessor& result, const value_type& value );// creates new element by copying
下面是一个例子:
{
hash_map_t::accessor a;
hash_map.insert( a, key ); // creates by default if not exists, acquires lock
a->second.my_vector.push_back( value ); // new or old entry, add to vector anyway
} // the accessor's lock is released here
在插入过程中,如果键不存在,则插入键并将值添加到其vector中。如果存在,则返回false,然后简单地将值添加到它的向量中。
{
hash_map_t::accessor accessor;
bool result = hash_map.insert(accessor, std::make_pair(key, {value})); // creates by default if not exists, acquires lock
if(result == false)
accessor->second.push_back(value); // if key exists
} // the accessor's lock is released here
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 为什么查找 + 插入的组合比单个插入语句工作得更快
- 查找并插入-STD :: MAP C
- 是否有具有对数时间插入、删除和查找(带距离)的排序数据结构
- 在二叉树中插入/查找问题
- 插入加密的 USB 驱动器后,如何使用 WMI 查找"启动器"逻辑磁盘?
- 具有非常快速的内>数据查找和快速反向查找(搜索/插入/删除数据)的压缩字典?
- C++ std::lower_bound() 函数来查找索引排序向量的插入点
- 是否有 std 或提升容器可以避免其插入和查找方法之间的争用条件
- 插入号码的常量时间查找
- 使用 STL 容器在 logN 中插入、查找最小(键)和删除(基于值)功能
- 对在 std::map 的查找/插入上使用可升级锁感到困惑
- Unordered_map::find()插入查找的键
- "std::map with mutexes"与并行插入、查找、擦除之间是否有任何速度测试"libcds maps (Michael Hashmap and Split Order List)"?
- TBB 并发哈希映射查找和插入
- 用于快速插入和查找n维实向量的适当容器(提供初始基准)