tbb :: concurrent_hash_map抛出SIGSEGV

时间:2010-09-29 21:15:36

标签: c++ multithreading parallel-processing tbb mingw32

我正在使用mingw32在Windows上运行使用TBB构建的小程序。它做了parallel_for。在parallel_for my对象内部对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-&gt; second时,抛出信号。

1 个答案:

答案 0 :(得分:1)

此代码中存在两个潜在问题。

首先,如果find()找不到指定的密钥,则无法取消引用a-&gt;秒。您应该使用insert()重写它,这将确保元素的存在或添加条件检查,如:

if( a ) // process it

其次,在访问者的锁定下调用getNext和hasConstraint。在锁定下调用任何东西是危险的,因为它可以在内部有另一个锁或调用TBB,因此可能导致死锁或其他问题。