您是否有理由无法使用方括号运算符访问concurrent_hash_map?
我一直这样做是为了简化代码的可读性(应该放在地图上的键上):
template <class Tkey, class Tval>
Tval concHashMapGet(concurrent_hash_map < Tkey, Tval >& chm , Tkey key)
{
concurrent_hash_map< Tkey, Tval >::const_accessor a;
if (chm.find(a, key))
return a->second;
else
throw;
}; //Will .release() when out of scope
我想知道我是否错过了正确的用法,因为看起来你需要获得一个访问器,然后运行find,然后获取值,然后释放访问器。法线贴图中的所有内容或c#中的ConcurrentDictionary都只使用方括号运算符完成。 (我想在STL地图中没有同步,但我在方括号后面。)
如果您发现此功能有任何问题,请告诉我。据我所知,编译器应该内联它吗?
答案 0 :(得分:2)
你的逻辑看起来是正确的,据我所知,并没有简短的方法。 concurrent_hash_map没有operator []的原因是,如果它返回std :: map :: opreator []中的引用,我们必须选择默认锁定(访问器或const_accessor),无论我们选择哪个,它都可能是在某些用例中选择错误。所以我们强迫来电者做出选择。
如果您不需要同时删除项目,请考虑使用tbb :: concurrent_unordered_map。这是一个更新的设计,具有无锁接口,并且具有operator []。
关于代码示例,“throw;”除非总是从try-block处理程序中调用代码,否则需要抛出一些东西。