我正在使用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编译器。
答案 0 :(得分:3)
您的问题中存在不兼容的假设。 OpenMp不是C标准的一部分,因此C规范不能说明OpenMp的线程模型,并确保其正常功能的安全性。直到最近,C甚至都没有线程模型。
C11现在有自己的线程模型,在该线程模型中,对IO流进行操作的函数是线程安全的:
每个流都有一个关联的锁,用于防止数据争用 当多个执行线程访问流并限制时 由多个线程执行的流操作的交错。 一次只有一个线程可以保持此锁定。锁是可重入的:a 单线程可以在给定时间多次保持锁定。
我认为还没有一个完全实现C11的编译器,但通常POSIX系统上的C库会满足这个特殊要求。如果有这样一个符合要求的实现,那么OpenMp实现将依赖于它来记录它的线程模型是否与C11的一致。