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
函数的调用中持续存在,直到它们的效果被对 __fsetlocking
或 funlockfile
.
的另一个调用还原
在这两种情况下,最终结果将是现有 _unlocked
函数与常规函数之间几乎没有性能差异,除非 _unlocked
变体作为内联函数实现或宏(如 putc_unlocked
)。
我注意到 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
函数的调用中持续存在,直到它们的效果被对 __fsetlocking
或 funlockfile
.
在这两种情况下,最终结果将是现有 _unlocked
函数与常规函数之间几乎没有性能差异,除非 _unlocked
变体作为内联函数实现或宏(如 putc_unlocked
)。