如何在OpenMP C ++中分配动态内存

时间:2016-01-02 13:44:29

标签: c++ parallel-processing openmp

我尝试并行功能,分配内存,但我有一个坏堆的例外。内存必须一次使用一些线程。

void GetDoubleParameters( CInd *ci )
{
    for(int i=0;i<ci->size();i++)
    {
        void *tmp;
        #pragma omp parallel private (tmp)
        {
            for(int j=0;j<ci[i].getValues().size();j++)
            {
                tmp = (void*)new double(ci[i].getValues()[j]);
                ci->getParameters().push_back(tmp);
            }
        }

    }
}

1 个答案:

答案 0 :(得分:0)

问题在于:

ci->getParameters().push_back(tmp);

ci被所有并行线程一次访问,其参数元素与push_back例程(可能是std :: vector)可能不是线程安全的。 您将不得不围绕此代码组织一些警卫。类似的东西:

omp_lock_t my_lock;
...
// initialize lock
omp_init_lock (&my_lock);
...

// do something sensible in parallel
  ...
  {
      omp_guard my_guard (my_lock);
      // protected region starts here
      // only one thread at a time works here
  }
  // more parallel work
  ...
}
omp_destroy_lock (&my_lock);