tbb并发哈希映射查找&插入

时间:2014-05-06 17:51:21

标签: c++ tbb concurrenthashmap

我目前正在使用tbb的并发哈希映射来执行并发插入哈希映射。每个键都是一个字符串,值是整数的向量。我想实现以下内容:在插入期间,如果密钥不存在,我插入它并将值添加到其向量。如果存在,我只需将值添加到其向量中。

在检查tbb并发哈希映射API之后,我注意到find和insert函数都只返回布尔值。那么如果它存在,如何返回指向键的指针呢?

2 个答案:

答案 0 :(得分:5)

有些方法需要在他们的参数中使用访问器。访问器基本上是一个指针,它与scoped_lock保护并发访问该元素。如果没有锁,则可以同时修改元素,从而导致数据争用。因此,永远不要直接在concurrent_hash_map中使用指向元素的指针(除非受访问者保护)。

此外,您的任务不需要find()方法,因为insert()方法会创建元素(如果该元素不存在)。

根据Reference manual,哈希映射具有以下方法,可能满足您的需求:

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

答案 1 :(得分:0)

在插入过程中,如果键不存在,则插入键并将值添加到其向量中。 如果存在,则返回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