5

我正在使用 openmp,我的程序如下所示:

\#pragma omp parallel for

for(x = 0, y = 0, x < 5, x++, y++)

     function(x, y, fp);

void function(int x , int y, FILE* fp);
{
   fprintf(fp, "(%d, %d)\n", x y);
}

我希望文件的内容为

(0, 0)
(2, 2)
(1, 1)
(3, 3)
(4, 4)

排序无关紧要,但坐标 x, y 应该是有序的,即程序不应该生成类似 (2, 3) 的东西。这种行为是否总是得到保证?我在 linux 上使用 gcc 编译器。

4

1 回答 1

3

您的问题中有不相容的假设。OpenMp 不是 C 标准的一部分,因此 C 规范不能说明 OpenMp 的线程模型并确保任何关于其正确功能的安全性。直到最近,C 甚至还没有线程模型。

C11 现在有自己的线程模型,并且在该线程模型中,对 IO 流进行操作的函数是线程安全的:

每个流都有一个关联的锁,用于防止多个执行线程访问流时的数据竞争,并限制多个线程执行的流操作的交错。一次只能有一个线程持有这个锁。锁是可重入的:单个线程可以在给定时间多次持有锁。

我认为目前还没有完全实现 C11 的编译器,但通常 POSIX 系统上的 C 库可以满足这一特殊要求。当会有这样一个符合要求的实现时,将由位于其之上的 OpenMp 实现来记录其线程模型是否与 C11 的一致。

于 2012-05-12T18:21:54.727 回答