为什么 printf 可以屏蔽竞争条件,而系统日志不能?

Why printf can mask the race-condition whereas syslog doesn't?

本文关键字:系统日志 不能 条件 竞争 printf 屏蔽 为什么      更新时间:2023-10-16

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

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

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

所以根据我的理解,"人"是错的。