多线程应用程序中的独立日志记录

时间:2019-01-21 09:49:33

标签: c++ c linux multithreading logging

我目前正在调试多线程应用程序(Linux ia64,ARM下的pthread)。 valgrind,helgrind和gdb是我目前使用的工具。

存在一些同步问题,为了以后进行分析, 我想将线程执行记录到一个或多个文件中。

天真的实现会做一些write / fprintf,这可能 (取决于libc的实现)锁定一些内部互斥锁。 反过来会影响程序的行为 (我称其为“意外锁定”) 因此是不可接受的。

搜索互联网只会产生逆解, 即如何同步线程如何记录。 注意:第三方日志记录库倾向于保证多线程安全 但并非相反。

所以我想出了将日志条目不同步地缓存在内存中的方法, ,并在程序退出时将其刷新到文件中。

我想对于许多开发人员来说这是一个普遍的问题, 我想知道是否有更好的方法。 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

现代的多线程安全高性能记录器通常:

  • 为每个线程提供一个单独的日志缓冲区,以便在线程将日志消息写入缓冲区(单生产者-单消费者免等待缓冲区)时不涉及锁定。
  • 日志消息是二进制的,没有snprintf或发出日志消息的线程中发生任何其他格式化。例如。日志消息是格式字符串和参数的副本(格式字符串可以浅复制)。
  • 具有一个单独的I / O线程,该线程从其他线程读取二进制日志消息,将其格式化并写入日志文件。
  • I / O线程对日志记录缓冲区进行定期轮询,因此在发出日志消息时不需要跨线程消息传递。消息产生者可以选择通知I / O线程立即开始将日志消息写出到日志文件中(例如,日志缓冲区的可用空间越来越小)。
相关问题