gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:54:46 24 4
gpt4 key购买 nike

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

有一些同步问题,稍后分析,我想将线程执行记录到一个或多个文件。

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

网上搜索只得到逆解,即如何同步线程。如何登录。注意:第三方日志库倾向于保证多线程安全但与上述相反。

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

我想这是许多开发人员的普遍问题,并且我想知道是否有更好的方法。有什么建议吗?

最佳答案

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

  • 为每个线程提供单独的日志记录缓冲区,这样当线程将日志消息写入缓冲区(单生产者单消费者无等待缓冲区)时不涉及锁定。
  • 日志消息是二进制的,没有 snprintf 或任何其他格式发生在发出日志消息的线程中。例如。日志消息是格式字符串和参数的拷贝(格式字符串可以浅复制)。
  • 有一个单独的 I/O 线程,用于从其他线程读取二进制日志消息、格式化它们并写入日志文件。
  • I/O 线程定期轮询日志缓冲区,因此在发出日志消息时不需要跨线程消息传递。消息生成器可以选择通知 I/O 线程立即开始将日志消息写入日志文件(例如,日志缓冲区可用空间越来越低)。

关于c++ - 多线程应用程序中的独立日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54287265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com