在 Linux 上使用 printf
写入标准输出是线程安全的吗?使用较低级别的 write
命令怎么样?
最佳答案
它不是由 C 标准指定的——它取决于你对 C 标准库的实现。事实上,C 标准甚至根本没有提到线程,因为某些系统(例如嵌入式系统)没有多线程。
在 GNU 实现 (glibc
) 中,stdio 中处理 FILE*
对象的大多数高级函数都是线程安全的。名称中通常没有 unlocked
的那些(例如 getc_unlocked(3)
)。但是,线程安全是在每个函数调用级别:例如,如果您对 printf(3)
进行多次调用,则每个调用都保证以原子方式输出,但其他线程可能会打印在您对 printf()
的调用之间进行处理。如果您想确保一系列 I/O 调用以原子方式获得输出,您可以在它们周围加上一对 flockfile(3)/funlockfile(3)
调用来锁定 FILE
句柄。请注意,这些函数是可重入的,因此您可以在它们之间安全地调用 printf()
,即使 printf()
本身进行调用也不会导致死锁到 flockfile()
.
write(2)
等低级 I/O 调用应该是线程安全的,但我不能 100% 确定 - write()
对内核进行系统调用以执行 I/O。这究竟是如何发生的取决于您使用的内核。它可能是 sysenter
指令,或旧系统上的 int
(中断)指令。一旦进入内核,就由内核来确保 I/O 是线程安全的。在我刚刚使用 Darwin Kernel Version 8.11.1 进行的测试中,write(2)
似乎是线程安全的。
关于c - Linux上C中的标准输出线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/467938/