c++ - vfprintf_unlocked() 等效吗?

标签 c++ linux g++ centos7 glibc

我注意到 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 函数的调用中持续存在,直到它们的效果被另一个对 __fsetlockingfunlockfile 的调用恢复。 .

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

关于c++ - vfprintf_unlocked() 等效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52267720/

相关文章:

c++ - 禁用 C++ 异常,如何使任何 std::throw() 立即终止?

c++ - boost::filesystem 体系结构 x86_64 的 undefined symbol

C++ 匿名 union 重新声明错误

c++ - 是否有一种优雅的可能性可以将多个集合包含到多重映射中?

c - 使用线程计算文件中单词出现次数的程序中的段错误

linux - grep 一个字符串,如果匹配则在匹配行上方查找具有特定单词的行

c++ - 使用系统(char * 命令)ssh 远程登录到服务器,并执行命令?

c++ - Qt 小部件全屏边距

c++ - std::u32string 与 std::string 和 std::u16string 之间的转换

c++ - 预处理之后和使用 CMake 编译之前的自定义构建步骤