vfprintf_unlocked() 等效?

vfprintf_unlocked() equivalent?

我注意到 IBM z/OS 2.3.0 offers vfprintf_unlocked()

不过,我在 glibc(CentOS 7 上的 2.17)中找不到等效项。该功能是 IBM 特有的吗?或者它在某些 headers 中可用吗?如果不是,是否有任何类似于 vfprintf_unlocked() 的更轻量级(例如,没有线程安全)并且可以将 printf 的格式字符串写入文件的函数?

谢谢!

I can't find an equivalent in glibc (2.17 on CentOS 7).

没有一个。要查看可用的功能,请执行以下操作:

nm -D /path/to/libc.so.6 | grep '_unlocked$'

一般来说,vfprintf 就是这样 "heavy",锁定和解锁流的开销不会有太大影响,除非你做了一些非常次优的事情,比如打印单个字符一次。

你可以调用__fsetlocking (stream, FSETLOCKING_BYCALLER)通知glibc锁定将在外部执行。在这种情况下,在 stream 上调用 vfprintf 等常规函数将不会执行锁定。有关更多信息,请参阅 stdio_ext(3) manual page

也可以调用 flockfile function,它也是 POSIX 的一部分。在glibc实现中,没有对后续的流函数调用如vfprintf进行原子操作,也避免了加锁开销

这两个操作都是粘性的,并且在对 _unlocked 函数的调用中持续存在,直到它们的效果被对 __fsetlockingfunlockfile.

的另一个调用还原

在这两种情况下,最终结果将是现有 _unlocked 函数与常规函数之间几乎没有性能差异,除非 _unlocked 变体作为内联函数实现或宏(如 putc_unlocked)。