2014-04-06 29 views
1

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

// 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(); 
} 

回答

3

基本上,既然你明确地打电话给accessor::release()。但通常,从代码质量的角度来看,我将锁定的范围限制到最小的必要区域,因为代码可能会以意想不到的方式进一步扩展,或者异常 - 安全性可能成为问题。

没有明确释放第三种方式是:

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

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

附:尽可能避免在串行代码中使用访问者,例如使用insert(value_type)表单。这将有助于减少线程安全的开销

+0

如果我采用方式3,在我明确释放它或线程死亡之前,tbb是否不会锁定对象? – NewToAndroid

+0

它遵循[RAII idiom](http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization),因此它将在'a'对象的作用域末尾的析构函数中释放。 – Anton