0

有没有理由不能使用方括号运算符访问 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 映射中没有同步,但我在方括号之后。)

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

4

1 回答 1

2

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

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

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

于 2013-04-17T23:06:39.710 回答