tbb::concurrent_hash_map 抛出 SIGSEGV
Posted
技术标签:
【中文标题】tbb::concurrent_hash_map 抛出 SIGSEGV【英文标题】:tbb::concurrent_hash_map throws SIGSEGV 【发布时间】:2010-09-29 21:15:36 【问题描述】:我正在使用 mingw32 在 Windows 上运行一个使用 TBB 构建的小程序。它做了一个parallel_for。在 parallel_for 中,我的对象对 concurrent_hash_map 对象进行了更改。它开始运行,但后来当我尝试使用访问器时抛出一个 SIGSEGV。不知道问题出在哪里。
我的对象:
class Foobar
public:
Foobar(FoobarParent* rw) : _rw(rw)
_fooMap = &_rw->randomWalkers();
void operator() (const tbb::blocked_range<size_t>&r ) const
for(size_t i = r.begin(); i != r.end(); ++i)
apply(i);
private:
void apply(int i) const
pointMap_t::accessor a;
_fooMap->find(a, i);
Point3D current = a->second;
Point3D next = _rw->getNext(current);
if (!_rw->hasConstraint(next))
return;
a->second = next;
FoobarParent* _rw;
pointMap_t* _fooMap;
;
pointMap_t 定义为:
typedef tbb::concurrent_hash_map<int, Point3D> pointMap_t;
有人能解释一下这个问题吗?我是新来的TBB。当apply方法调用a->second时抛出信号。
【问题讨论】:
问这个问题的最佳地点是 TBB 论坛。此外,您还必须向我们展示您是如何调用 parallel_for 函数的。 @Nav 感谢您的评论。我最终在不使用 TBB 的情况下重写了这个应用程序。下次我尝试 TBB 时,我会使用 TBB 论坛。谢谢! 【参考方案1】:这段代码有两个潜在的问题。
首先,如果find()
没有找到指定的key,会导致a->second解引用失败。您应该使用 insert()
重写它,这将确保元素的存在或添加条件检查,例如:
if( a ) // process it
其次,在访问者的锁下调用 getNext 和 hasConstraint。在锁下调用任何东西是很危险的,因为它内部可能有另一个锁或对 TBB 的调用,因此可能导致死锁或其他问题。
【讨论】:
以上是关于tbb::concurrent_hash_map 抛出 SIGSEGV的主要内容,如果未能解决你的问题,请参考以下文章