2014-05-06 21 views
3

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

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

+0

我有没有回答你的问题? – Anton

+0

对延迟标记正确答案表示歉意。是的,你做到了。感谢您的支持。我发现tbb社区确实很小! – NewToAndroid

+1

谢谢:)是的,[标签:tbb]社区是相当小,upvotes,问题,意见少数。 – Anton

回答

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 
+0

访问者锁定在一个记录(类似的交易记忆)或整个地图上的锁(所有的操作将锁定一样会用标准std :: unordered_map + std :: lock手动执行)? – DuckQueen

+0

当然,只有一个元素被访问者锁定。请注意,它是读写锁,请参阅const_accessor – Anton