在OpenMP循环中赋值boost :: ptr_vector

时间:2016-04-18 06:18:42

标签: c++ multithreading boost concurrency openmp

是否可以在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;
}

感谢您的帮助!

1 个答案:

答案 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));
    }

似乎适用于此示例,但这种方法通常是否安全?