vfprintf_unlocked()是否等效?

时间:2018-09-11 02:05:11

标签: c++ linux g++ centos7 glibc

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

我在glibc中找不到等效项(在CentOS 7上为2.17)。该功能特定于IBM吗?还是在某些标题中可用?如果不是,是否有类似vfprintf_unlocked()的函数更轻(例如,没有线程安全)并且可以使用printf的格式字符串写入文件?

谢谢!

2 个答案:

答案 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函数的调用中一直存在,直到它们的效果被另一个对__fsetlockingfunlockfile的调用所恢复。

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