printf在Linux上是否使用线程安全写入stdout ?使用下级write命令怎么办?
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()。
glibc
FILE*
unlocked
getc_unlocked(3)
printf(3)
printf()
flockfile(3)/funlockfile(3)
FILE
flockfile()
诸如此类的低级I / O调用write(2)应该是线程安全的,但我对此不是100%肯定的- write()使系统调用内核以执行I / O。具体如何发生取决于您所使用的内核。它可能是该sysenter指令,也可能是int旧系统上的(中断)指令。一旦进入内核,就由内核来确定I / O是线程安全的。在我刚刚对Darwin Kernel版本8.11.1进行的测试中,它write(2)似乎是线程安全的。
write(2)
write()
sysenter
int