【问题标题】:Correctly using an accessor in tbb在 tbb 中正确使用访问器
【发布时间】:2014-04-06 19:22:12
【问题描述】:

我有一个要插入到 tbb 的并发哈希映射中的项目列表。使用访问器的正确方法是 1 还是 2?

// way 1
for (a list of (keys,values))
{
    MAP::accessor a;

    myHashTable.insert(a, key);
    (a->second).push_back(value);

    a.realease();
}

// way 2

MAP::accessor a;

for (a list of (keys,values))
{ 
    myHashTable.insert(a, key);
    (a->second).push_back(value);

    a.realease();
}

【问题讨论】:

    标签: c++ concurrency tbb


    【解决方案1】:

    基本上也可以,因为您明确调用accessor::release()。但一般来说,从代码质量的角度来看,我会将锁定的范围限制在最小的必要区域,因为代码可能会以意想不到的方式进一步扩展或/并且异常安全可能是一个问题。

    不显式释放的第三种方式是:

    // way 3
    for (a list of (keys,values))
    {
        MAP::accessor a;
    
        myHashTable.insert(a, key);
        (a->second).push_back(value);
    }
    

    附:尽可能避免在串行代码中使用访问器,例如使用插入(值类型)形式。这将有助于减少线程安全的开销

    【讨论】:

    • 如果我采用方式 3,在我显式释放它或线程死亡之前,tbb 不会对对象保持锁定吗?
    • 它遵循RAII idiom,因此它将在'a'对象作用域末尾的析构函数中释放。
    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多