是否可以在OpenMP循环中填写boost::ptr_vector
?我唯一能看到如何添加新的' ptr_vector
的输入是push_back()
,我认为这不是线程安全的。
请参阅下面的示例(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;
}
感谢您的帮助!
答案 0 :(得分:0)
要回答我自己的问题,解决方法是使用replace()函数:
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));
}
似乎适用于此示例,但这种方法通常是否安全?