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

qua*_*rtz 5 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);
}
Run Code Online (Sandbox Code Playgroud)

我希望文件的内容为

(0, 0)
(2, 2)
(1, 1)
(3, 3)
(4, 4)
Run Code Online (Sandbox Code Playgroud)

排序无关紧要,但坐标x,y应按顺序排列,即程序不应生成类似(2,3)的内容.这种行为总是得到保证吗?我在linux上使用gcc编译器.

Jen*_*edt 3

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

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

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

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