它不是C标准指定的-取决于您对C标准库的实现。实际上,C标准甚至根本没有提到线程,因为某些系统(例如嵌入式系统)没有多线程。
在GNU实现(
glibc)中,stdio中处理
FILE*对象的大多数高级函数都是线程安全的。通常没有
unlocked名字的(例如
getc_unlocked(3))。但是,线程安全性处于每个函数调用级别:
printf(3)例如,如果您多次调用,则保证每个调用都是原子输出的,但是其他线程可能会在调用之间打印输出
printf()。如果要确保自动输出一系列I
/
O调用,则可以在它们周围加上一
flockfile(3)/funlockfile(3)对调用来锁定该
FILE句柄。请注意,这些函数是可重入的,因此您可以安全地
printf()在它们之间
printf()进行调用,即使以为本身对进行了调用,也不会导致死锁
flockfile()。
诸如此类的低级I / O调用
write(2)应该是线程安全的,但我对此不是100%肯定的-
write()使系统调用内核以执行I /
O。具体如何发生取决于您所使用的内核。它可能是该
sysenter指令,也可能是
int旧系统上的(中断)指令。一旦进入内核,就由内核来确定I /
O是线程安全的。在我刚刚对Darwin Kernel版本8.11.1进行的测试中,它
write(2)似乎是线程安全的。



