2015-08-13 3 views
0

У меня есть сетка с огромным количеством сегментов, я хочу применить фильтр и заполнить std::set set_, который является частным членом класса A. Существует функция называется fill_vec(), который собирается заполнить вектор с использованием for цикла:OpenMP через std :: set using iterator

fill_set() 
{ 
    for(mesh::SegIterator it = A.beginSeg(); it != A.endSeg(); ++it) 
    { 
    mesh::Segment Seg_ = *it; 
    int SignP = 0; 
    int SignN = 0; 


    for(mesh::PointIterator itp = Seg_.beginPoint(); itp != Seg_.endPoint(); ++itp) 
    { 
     double old_, new_; 
     ... 
     ... 

     if(old_ > 0.0 && new_ > 0.0) 
     SignP++; 
     if(old_ < 0.0 && new_ < 0.0) 
     SignN++; 
    } 
    if((SignP == 1 && SignN == 1) || (SignP == 1 && SignN == 2)) 
    { 
     set_.insert(Seg_); 
    } 
} 

Я пытаюсь peform выше кода параллельно с использованием OpenMP и C++ 03. Я видел некоторые решения, такие как this. Любое другое безопасное и аккуратное решение?

+0

Является ли сетка :: SegIterator RandomAccessIterator или просто двунаправленнымИстер (или даже просто ForwardIterator)? – SirGuy

+0

Я не понимаю, почему вы не можете использовать те же методы [я описал для std :: vector] (https://stackoverflow.com/questions/18669296/c-openmp-parallel-for-loop-alternatives-to -stdvector/18671256 # 18671256). Записывайте частные наборы для каждого потока и объединяйте их с 'insert' в критическом разделе. –

ответ

3

Попробуйте изменить с it != A.endSeg() на it < A.endSeg(). Проблема с != - это цикл не счет. Компилятор не может точно знать, что цикл никогда не закончится. Переключение его на < должно сделать его счетным.

+2

Вам также понадобится критический раздел вокруг строки 'set_.insert (Seg _);', поскольку контейнеры std не могут быть изменены асинхронно. – SirGuy

+0

Хороший улов. @GuyGreer – jefflarkin