它不是由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)
)应该是线程安全的,但我不能write(2)
%确定这一点——write()
会对内核进行系统调用以执行I/O.具体发生的方式取决于您使用的内核.它可能是sysenter
指令,或者旧系统上的int
(中断)指令.一旦进入内核,就由内核来确保I/O是线程安全的.在我刚刚对Darwin内核版本8.11.1进行的测试中,write(2)
似乎是线程安全的.