我目前正在使用tbb的并发哈希映射来执行并发插入哈希映射。每个键都是一个字符串,值是整数的向量。我想实现以下内容:在插入期间,如果密钥不存在,我插入它并将值添加到其向量。如果存在,我只需将值添加到其向量中。
在检查tbb并发哈希映射API之后,我注意到find和insert函数都只返回布尔值。那么如果它存在,如何返回指向键的指针呢?
答案 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