在openmp并行循环中调用函数

call function in openmp parallelized loop

我是 OpenMP 的新手,我有一个要与 OpenMP 并行化的循环。在并行循环内调用一个子程序。这是我的代码:

#pragma omp parallel for shared(dir,utilitiespath,frequency,solvent,Method,dispersion)  private(beginning,file_cp2k,file_geo,file_energy)
for(i=1;i<=n_conformers;i=i+1)
{
    time(&beginning);
    file_cp2k="conformer"+ QString::number(i) +".inp";
    file_geo= "conformer" +  QString::number(i) + "_geoMM.sdf";
    file_energy=dir+ "conformer" + QString::number(i)  + "_enerSE";
    cout<<"loop "<<i<<" time "<<beginning<< endl;
    int n_atom=Makecp2kOptInput(file_geo, file_cp2k, dir,utilitiespath, frequency, solvent, Method,dispersion);
}

我收到以下错误:

* Error in `./ChemAliveMolOpt': double free or corruption (fasttop): 0x00000000018d7c00 * Aborted (core dumped)

如果我删除对子例程的调用就没有问题。

我应该如何继续正确并行化循环?

谢谢

支持 OpenMP 的循环执行的所有代码必须线程安全。您的子例程可能不是线程安全的。线程安全本质上意味着您同步对所有 global/shared 对象的访问。

这不是一个简单的话题,所以我建议你学习线程安全和基于互斥锁的同步来解决你的问题。