tbb :: concurrent_hash_map выбрасывает SIGSEGV - PullRequest
1 голос
/ 30 сентября 2010

Я использую небольшую программу, созданную с использованием TBB для Windows с mingw32.Это делает 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.

1 Ответ

1 голос
/ 27 апреля 2014

В этом коде есть две потенциальные проблемы.

Во-первых, если find() не найдет указанный ключ, он не сможет разыменовать-> секунду.Вам следует переписать его либо с помощью insert(), который обеспечит существование элемента, либо добавит проверку условия, например:

if( a ) // process it

Во-вторых, вы вызываете getNext и hasConstraint под блокировкой метода доступа.Опасно вызывать что-либо под блокировкой, поскольку внутри него может быть другая блокировка или вызов TBB, что может привести к тупику или другим проблемам.

...