【发布时间】:2011-08-22 05:11:00
【问题描述】:
我对 OpenMP 有点陌生,但总体上具有并行处理方面的经验。我之前使用过 boost::threads,现在我正在使用 openmp 进行测试。
问题是我不知道如何处理共享数据访问,因为我真的不知道 openmp 在内部对并行循环内的共享数据对象做了什么。
我现在正在做的事情(到目前为止一直有效):我使用 mmap 将文件从磁盘读取到内存中。我在内存映射部分之后收到一个关于 char 的指针。
OpenMP 现在可以在 OpenMP 并行 for 循环中使用此指针并在线程之间共享数据。我现在可以在映射和共享文件中搜索正则表达式匹配项,多个线程对照(相当长的)正则表达式列表检查每个字符串。
我在 openmp 循环中将这个列表(一个包含正则表达式的向量)设为私有,所以每个线程都有它自己的这个列表的副本。
问题来了:
为了显着提高我的应用程序的性能,我需要能够在匹配字符串后从该向量中删除(正则表达式)项目。
现在所有其他活动线程也需要尽快从他们的列表中删除该项目。
所以我将此列表设为 openmp 循环内的共享数据对象,但现在当我尝试将 (vector.erase(item#)) 写入列表时,我在运行时遇到分段错误。
有了 boost::threads,我就可以在写/读时使用互斥锁来锁定这个对象。
但是 openmp 似乎自己处理了大部分同步,所以现在我想知道在使用对我来说是新的 openmp 时处理这个问题的正确方法是什么。
【问题讨论】:
-
你有一个最小的例子来说明这个问题吗?