OpenMP共享数据

时间:2011-05-10 06:40:42

标签: c++ openmp shared

我对OpenMP有些新手,但总体上有并行处理的经验。之前我曾与boost::threads合作,现在我正在使用openmp进行测试。

问题在于我不知道如何处理共享数据访问,因为我真的不知道openmp在内部对并行循环内的共享数据对象做了什么。

我现在正在做什么(到目前为止这是有效的):我使用mmap将文件从磁盘读入内存。我在内存映射部分之后收到一个关于char的指针。

OpenMP现在可以在OpenMP并行for循环中使用此指针,并在线程之间共享数据。我现在能够在映射和共享文件中搜索正则表达式匹配,多个线程检查每个字符串与(非常长的)正则表达式列表。

我在openmp循环中将这个列表(包含正则表达式的向量)私有化,因此每个线程都有它自己的列表副本。

问题出现了:

为了显着提高应用程序的性能,我需要能够在匹配字符串时从该向量中删除(regex-)项目。

现在所有其他活动线程都需要从列表中删除此项目。

所以我把这个列表作为openmp循环中的共享数据对象,但是现在当我尝试将(vector.erase(item#))写入列表时,我在运行时会出现分段错误。

使用boost :: threads我会在写/读它时使用互斥锁来锁定这个对象。

但openmp似乎处理了大部分同步本身,所以现在我想知道在使用对我来说不熟悉的openmp时处理这个问题的正确方法是什么。

1 个答案:

答案 0 :(得分:1)

您可以通过创建关键部分来实现这一目标。

#pragma omp critical
{
   ...some synchronized code...
}

修改 删除了关于'#pragma omp atomic'的部分,因为它无法以原子方式执行所需的操作。