单行的fprintf命令是线程安全的吗?

时间:2012-05-12 17:54:42

标签: c openmp

我正在使用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编译器。

1 个答案:

答案 0 :(得分:3)

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

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

  

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

我认为还没有一个完全实现C11的编译器,但通常POSIX系统上的C库会满足这个特殊要求。如果有这样一个符合要求的实现,那么OpenMp实现将依赖于它来记录它的线程模型是否与C11的一致。