我注意到IBM z / OS 2.3.0 offers vfprintf_unlocked()。
我在glibc中找不到等效项(在CentOS 7上为2.17)。该功能特定于IBM吗?还是在某些标题中可用?如果不是,是否有类似vfprintf_unlocked()
的函数更轻(例如,没有线程安全)并且可以使用printf
的格式字符串写入文件?
谢谢!
答案 0 :(得分:1)
我在glibc中找不到等效项(在CentOS 7上为2.17)。
没有一个。要查看可用的功能,请执行以下操作:
nm -D /path/to/libc.so.6 | grep '_unlocked$'
通常,vfprintf
太“繁重”,锁定和解锁流的开销不足以解决问题,除非您进行了一些次优的操作,例如一次打印一个字符。
答案 1 :(得分:1)
您可以致电__fsetlocking (
stream
, FSETLOCKING_BYCALLER)
通知glibc锁定将在外部执行。在这种情况下,在 vfprintf
上调用诸如stream
之类的常规函数将不会执行锁定。有关其他信息,请参见stdio_ext(3) manual page。
也可以调用flockfile
function,它也是POSIX的一部分。在glibc实现中,不会对诸如vfprintf
之类的后续流函数调用执行原子操作,这也避免了锁定开销。
这两个操作都很棘手,并且在对_unlocked
函数的调用中一直存在,直到它们的效果被另一个对__fsetlocking
或funlockfile
的调用所恢复。
在两种情况下,最终结果是,现有_unlocked
函数和常规函数之间几乎没有性能差异,除非_unlocked
变体实现为内联函数或宏(如putc_unlocked
中一样。)