2010-09-29 2 views
1

Я запускаю небольшую программу, созданную с использованием TBB в Windows с помощью mingw32. Он выполняет функцию parallel_for. Внутри parallel_for мой объект вносит изменения в объект concurrent_hash_map. Он запускается, но позже бросает SIGSEGV, когда я пытаюсь использовать аксессор. Я не знаю, где проблема.tbb :: concurrent_hash_map throws 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

+0

@Nav Спасибо за ваш комментарий. Я закончил переписывание этого приложения без использования TBB. В следующий раз, когда я дам TBB попробовать, я буду использовать форум TBB. Спасибо! –

ответ

1

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

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

if(a) // process it 

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

Смежные вопросы