TBB 并发哈希映射查找和插入

tbb concurrent hash map find & insert

本文关键字:插入 查找 映射 并发 哈希 TBB      更新时间:2023-10-16

我目前正在使用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
相关文章: