c++ - 为什么 printf 可以屏蔽竞争条件而 syslog 不能?

标签 c++ c linux syslog

<分区>

我知道 printf 可以屏蔽代码中的竞争条件。但是,我不明白为什么 syslog 不能屏蔽它。人们说 syslog 类似于发布版本。我们有三种构建变体——调试(串行调试 + 启用系统日志)、生产(启用系统日志)和发布版本(不启用串行调试和系统日志)。人们说尝试生产 - 即仅启用系统日志来调试问题。我不明白为什么系统日志不会掩盖竞争条件。有人可以解释一下吗?

最佳答案

标准的 stdio 函数,例如 printf,执行锁定是线程安全的,因此包含对 printf 的调用的多线程代码可以在某种程度上被序列化。这可以改变具有竞争条件的代码的行为。 (您可以查看“unlocked_stdio”的手册页,了解一些 stdio 函数的非锁定版本。在某些情况下,使用一个或另一个可能会产生非常大的性能差异。)

我对系统日志不太熟悉。据我所知,一些 版本的 syslog 不做任何锁定,不是线程安全的,也不会导致相同的序列化,但是 Linux syslog 实现 线程安全,并且应该导致与 printf 类似(但可能不完全相同)的序列化。

所以按照我的理解,“人”是错误的。

关于c++ - 为什么 printf 可以屏蔽竞争条件而 syslog 不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20780591/

相关文章:

c# - 从 C++ COM 服务器将 VARIANT 中的 SAFEARRAY 传递给 C# 的异常

c - 取消引用空指针

c - 在 C 中搜索二进制模式(读取缓冲的二进制文件)

c++ - 关于这个在 Linux 上用 gcc 编译的程序中的 vtable,nm 告诉我什么?

c++ - 从字符串中删除所有字符

c++ - int main()/函数的问题

c - 当超出 C 中的整数范围时会发生无限循环

php - 用于 PHP 托管的 PowerPC Linux 计算机总是抛出 "Balloc() allocation exceeds list boundary"错误

linux - 使用Linux shell脚本在文件名中插入文本

c++ - Qt Ros 工作区中的 QVTKWidget 问题