【问题标题】:TBB concurrent_hash_map operator[] or similar access?TBB concurrent_hash_map operator[] 或类似的访问?
【发布时间】:2013-04-17 10:41:50
【问题描述】:

是否有您无法使用方括号运算符访问 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

我想知道我是否遗漏了有关正确用法的内容,因为您似乎需要获取访问器,然后运行查找,然后获取值,然后释放访问器。法线贴图或 c# 中的 ConcurrentDictionary 中的所有这些都仅使用方括号运算符完成。 (好吧,我猜 STL 映射中没有同步,但我在方括号之后。)

此外,如果您发现此功能有任何问题,请告诉我。据我所知,编译器应该内联吗?

【问题讨论】:

    标签: c++ map hashmap tbb concurrenthashmap


    【解决方案1】:

    您的逻辑看起来是正确的,据我所知,没有更短的方法可以做到这一点。 concurrent_hash_map 没有 operator[] 的原因是,如果它返回 std::map::opreator[] 中的引用,我们将不得不选择默认锁定(访问器或 const_accessor),无论我们选择哪个,它都可能是在某些用例中的错误选择。所以我们强迫调用者做出选择。

    如果您不需要同时擦除项目,请考虑改用 tbb::concurrent_unordered_map。这是一个更新的设计,具有无锁界面,并且确实有 operator[]。

    关于代码示例,“throw;”需要抛出一些东西,除非代码总是从 try-block 处理程序内部调用。

    【讨论】:

    • 是的,我想我会把这个扔在那里,因为我的代码应该为它要求的每个键都有一些东西。捕获潜在逻辑错误的简单方法。我想我会在其他地方使用它时对其进行修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多