有什么原因导致您无法使用方括号运算符访问 concurrent_hash_map 吗?
我一直这样做是为了提高代码的可读性(在应该在 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
而且我想知道我是否遗漏了一些关于正确用法的信息,因为您似乎需要获取访问器,然后运行查找,然后获取值,然后释放访问器。法线贴图或 C# 中的 ConcurrentDictionary 中的所有这些都是使用方括号运算符完成的。 (好吧,我猜 STL 映射中没有同步,但我在方括号后面。)
此外,如果您发现此功能有任何问题,请告诉我。据我所知,编译器应该内联它吗?
最佳答案
您的逻辑看起来是正确的,据我所知,没有更短的方法可以做到这一点。 concurrent_hash_map 没有 operator[] 的原因是,如果它像 std::map::opreator[] 那样返回一个引用,我们将不得不选择一个默认锁定(accessor 或 const_accessor),无论我们选择哪个,它都可能是在某些用例中是错误的选择。所以我们强制调用者做出选择。
如果您不需要同时删除项目,请考虑改用 tbb::concurrent_unordered_map。这是一个更新的设计,有一个无锁接口(interface),并且有 operator[]。
关于代码示例,“throw;”除非始终从 try block 处理程序内部调用代码,否则需要抛出一些东西。
关于c++ - TBB concurrent_hash_map operator[] 或类似访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16057917/