2010-09-29 54 views
1

我使用mingw32在Windows上运行使用TBB构建的小程序。它做了一个parallel_for。在我的对象的parallel_for内部对concurrent_hash_map对象进行更改。它开始运行,但后来在尝试使用访问器时抛出SIGSEGV。我不知道问题出在哪里。tbb :: 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时,该信号被抛出。

+0

最好的地方问TBB论坛。此外,你必须告诉我们你是如何调用parallel_for函数的。 – Nav 2011-03-05 06:25:49

+0

@Nav感谢您的评论。我最终在不使用TBB的情况下重写了这个应用程序。下一次我给TBB一个尝试,我会使用TBB论坛。谢谢! – 2011-03-05 14:40:51

回答

1

这段代码有两个潜在的问题。

首先,如果find()未找到指定的密钥,则无法解除引用a->秒。你应利用insert()改写它,这将确保该元素存在或添加条件检查,如:

if(a) // process it 

其次,你叫GETNEXT和hasConstraint访问者的锁定下。调用任何锁之下的任何东西都是危险的,因为它可能有另一个锁或者调用TBB,从而导致死锁或其他问题。