Почему printf может маскировать состояние гонки, а syslog - нет?

0

Я понимаю, что printf может маскировать условие гонки в коде. Однако я не понимаю, почему syslog не может его замаскировать. Люди говорят, что syslog похож на сборку релизов. У нас есть три варианта сборки: debug (серийная отладка + syslog включена), производство (syslog включено) и релиз (без последовательной отладки и без syslog). Говорят, попробуйте production-, чтобы включить syslog только для отладки проблемы. Я не мог понять, почему syslog не замаскирует состояние гонки. Может кто-нибудь объяснить?

  • 1
    Можете ли вы привести пример или контекст? то есть. Можете ли вы привести пример, где printf сериализует вещи, как вы ожидаете, а syslog нет? Без каких-либо дополнительных деталей (особенно примеров кода) ваш вопрос слишком расплывчатый.
Теги:
syslog

1 ответ

2

Стандартные функции stdio, такие как printf, обеспечивают блокировку, чтобы быть потокобезопасной, поэтому многопоточный код, содержащий вызовы printf, может быть в некоторой степени сериализован. Это может изменить поведение кода с условиями гонки. (Вы можете посмотреть man-страницу для "unlocked_stdio" для неблокирующих версий некоторых функций stdio. В некоторых случаях использование одного или другого может сделать удивительно большие различия в производительности).

Я менее знаком с syslog. Насколько я знаю, некоторые версии syslog не делают никакой блокировки, не являются потокобезопасными и не вызывают такую же сериализацию, но реализация syslog Linux является потокобезопасной и должна вызывать аналогичные (но, вероятно, не совсем такая же) сериализация, как printf.

Поэтому, согласно моему пониманию, "люди" ошибаются.

  • 0
    +1 и отказался от ответа, потому что я не знал, что функции stdio выполняли блокировку. Я узнал что-то новое сегодня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню