我注意到 IBM z/OS 2.3.0 offers vfprintf_unlocked() .
不过,我在 glibc 中找不到等效项(CentOS 7 上的 2.17)。该功能是 IBM 特有的吗?或者它在某些标题中可用?如果没有,是否有任何类似于 vfprintf_unlocked()
的更轻量级(例如非线程安全)并且可以采用 printf
的格式字符串写入文件的函数?
谢谢!
最佳答案
您可以调用__fsetlocking (
stream
, FSETLOCKING_BYCALLER)
来通知glibc锁定将在外部执行。在这种情况下,在 stream
上调用 vfprintf
等常规函数将不执行锁定。请参阅stdio_ext(3) manual page了解更多信息。
也可以调用flockfile
function ,这也是 POSIX 的一部分。在glibc实现中,后续的流函数调用(例如vfprintf)不会执行原子操作,这也避免了锁定开销。
这两个操作都是粘性的,并且在对 _unlocked
函数的调用中持续存在,直到它们的效果被另一个对 __fsetlocking
或 funlockfile
的调用恢复。 .
在这两种情况下,最终结果将是现有 _unlocked
函数与常规函数之间几乎没有性能差异,除非实现了 _unlocked
变体作为内联函数或宏(如 putc_unlocked
)。
关于c++ - vfprintf_unlocked() 等效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52267720/