调用printf函数是否在同时运行的线程中是线程安全的?

12

可能是重复的问题:
C语言在Linux上,stdout线程安全吗?

假设 thread1 和 thread2 相似,在完成其任务后,它们都会使用 printf。这样做是否线程安全,或者它们需要以某种方式锁定 printf?

这与标准输出 stdout 有关吗?如果在每个 printf 后执行 fflush(stdout),是否会改变什么?


1
请参见 https://dev59.com/03RB5IYBdhLWcg3w6bYE - icecrime
1个回答

11

POSIX.1和C语言函数用于操作字符流(由指向FILE类型对象的指针表示),要求根据POSIX.1c规定以实现可重入的方式来实现(详见ISO/IEC 9945:1-1996,§8.2)。

参见Thread-safety and POSIX.1

注意:某些函数可以是可重入或不可重入的,这取决于它们的参数。


8
这些函数不是可重入的。它们是线程安全的。这之间有很大的区别。可重入的函数自动是线程安全的,但线程安全的函数如果在同一线程中被再次调用(例如从信号处理程序中),仍然可能会出现死锁(或更糟糕的情况)。 - R.. GitHub STOP HELPING ICE
以下是更多的参考资料:http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html 和 http://www.opengroup.org/onlinepubs/9699919799/functions/flockfile.html 特别是在后者中:“所有引用(FILE *)对象的函数应该表现得好像它们在内部使用 flockfile()funlockfile() 来获取这些(FILE *)对象的所有权。” - R.. GitHub STOP HELPING ICE
我倾向于认为实际上的情况是,printf是安全的,因为它基本上只将内容写入stdout作为其唯一的“线程安全关键”工作,如果不安全,那将会很有趣,因为使用bulldozer运行stdout的实用程序在所有系统上同时运行[如果你找到一个不这样做的系统,祝你好运运行任何东西]。 - j riv
不,@Lela,这种想法完全是错误的。进程本地数据结构的线程安全与在同一系统上运行的其他程序完全无关。进程不会将它们的变量共享给彼此。您似乎也混淆了stdout是所有进程共享的单个文件/设备,而实际上除非一个程序正在等待另一个程序终止或根本没有使用stdout,否则很少有多个程序共享相同的打开文件描述符。 - R.. GitHub STOP HELPING ICE
@Lela Dax:你所缺少的“线程安全关键”工作是操作stdout缓冲区,它是进程内部但在线程之间共享的。 - caf
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接