c++ - TBB concurrent_hash_map operator[] 或类似访问?

标签 c++ dictionary hashmap tbb concurrenthashmap

有什么原因导致您无法使用方括号运算符访问 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/

相关文章:

java - 将 TreeSet 转换为填充 HashMap 的最佳方法是什么?

C++ 数组初始值设定项。使用枚举类型

c++ - 使用模板获取数组的大小和结束地址

c++ - Qt Linux/XP 差异 - 使用户无法调整窗口大小

python - 迭代带有列表的字典以创建 n 个子图

java - arrayList for 循环到 hashMap 的大小显示是正确的,但元素少了一个。没有使用重复的 key

c++ - std::vector 成员变量可以未初始化(内存错误)吗?

ios - 使用字典数据迭代 Dictionary 并将其添加到 swift 数组中

ios - IOS快捷方式:使用应用程序设置(嵌套)词典以修改EXIF数据

java - 如何将字符串一分为二并将其存储在字段中