<分区>
我知道 printf 可以屏蔽代码中的竞争条件。但是,我不明白为什么 syslog 不能屏蔽它。人们说 syslog 类似于发布版本。我们有三种构建变体——调试(串行调试 + 启用系统日志)、生产(启用系统日志)和发布版本(不启用串行调试和系统日志)。人们说尝试生产 - 即仅启用系统日志来调试问题。我不明白为什么系统日志不会掩盖竞争条件。有人可以解释一下吗?
<分区>
我知道 printf 可以屏蔽代码中的竞争条件。但是,我不明白为什么 syslog 不能屏蔽它。人们说 syslog 类似于发布版本。我们有三种构建变体——调试(串行调试 + 启用系统日志)、生产(启用系统日志)和发布版本(不启用串行调试和系统日志)。人们说尝试生产 - 即仅启用系统日志来调试问题。我不明白为什么系统日志不会掩盖竞争条件。有人可以解释一下吗?
最佳答案
标准的 stdio 函数,例如 printf,执行锁定是线程安全的,因此包含对 printf 的调用的多线程代码可以在某种程度上被序列化。这可以改变具有竞争条件的代码的行为。 (您可以查看“unlocked_stdio”的手册页,了解一些 stdio 函数的非锁定版本。在某些情况下,使用一个或另一个可能会产生非常大的性能差异。)
我对系统日志不太熟悉。据我所知,一些 版本的 syslog 不做任何锁定,不是线程安全的,也不会导致相同的序列化,但是 Linux syslog 实现是 线程安全,并且应该导致与 printf 类似(但可能不完全相同)的序列化。
所以按照我的理解,“人”是错误的。
关于c++ - 为什么 printf 可以屏蔽竞争条件而 syslog 不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20780591/