2016-04-18 13 views
0

OpenMPループ内にboost::ptr_vectorを記入することは可能ですか? ptr_vectorに「新しい」エントリを追加する方法がわかる唯一の方法は、push_back()経由です。これはスレッドセーフではないと想定しています。OpenMPループのboost :: ptr_vectorの割り当て

以下の例(gcc compilation: g++ ptr_vector.cpp -fopenmp -DOPTION=1)を参照してください。現在のところg++ ptr_vector.cpp -DOPTION=2のみが動作します。

#include <boost/ptr_container/ptr_vector.hpp> 
#include <iostream> 

#ifdef _OPENMP 
#include <omp.h> 
#endif 

int main() { 
     boost::ptr_vector<double> v; 
     int n = 10; 

#  if OPTION==1 
     v.resize(n); 
#  endif 

     int i; 
     #ifdef _OPENMP 
     #pragma omp barrier 
     #pragma omp parallel for private(i) schedule(runtime) 
     #endif 
#  if OPTION==1 
     for (i=0; i<n; ++i) { 
       double * vi = &v[i]; 
       vi = new double(i); 
     } 
#  elif OPTION==2 
     for (i=0; i<n; ++i) 
       v.push_back(new double(i)); 
#  endif 

     for (size_t i=0; i<n; ++i) 
       std::cout << "v[" << i << "] = " << v[i] << std::endl; 
} 

ありがとうございました!

+1

http://stackoverflow.com/questions/18669296/c-openmp-parallel-for-loop-alternatives-to-stdvector/18671256#18671256 –

答えて

0

自分の質問に答えるためには、解決策を交換してください()関数を使用することです:

int i; 
    #ifdef _OPENMP 
    #pragma omp barrier 
    #pragma omp parallel for private(i) schedule(runtime) 
    #endif 
    for (i=0; i<n; ++i) { 
      v.replace(i,new double(i)); 
    } 

は、この例のために働くように見えるのが、この方法のスレッドは、一般的に安全なのですか?

関連する問題