C++ - 以面向性能的方式读取日志级别

问题描述

logger 组件是一个静态库。应用程序(服务)加载大约 20 个 DLL。应用程序和 DLL 与静态记录器库链接。还有其他应用程序 (UI/CLI) 可以更新 Windows 上共享内存中的日志级别。

主应用程序和 DLL 从共享内存中读取日志级别并决定是否记录特定的日志语句。读取日志级别受命名互斥锁保护,这会带来巨大的性能损失。

使阅读日志级别轻量化的最佳方法是什么。

解决方法

就像@rustyx 建议的那样,使用 std::atomic<> 可能是您的最佳选择。缓存一致性协议会为您处理同步,而且速度会尽可能快,而无需您自己监控更改。

几点:

  • 使其尽可能小,例如使用 atomic_uchar
  • 通过 is_lock_free() 方法验证实现是无锁的。
  • 验证它是无地址的,因为您需要将它保存在共享内存中(请查看您的编译器或标准库的文档)。

否则,如果 1. 原子开销对你来说太大,2. 日志级别几乎从不改变,3. 你不介意改变后的小“延迟”,那么你可以创建一个本地副本并拥有您每隔“一段时间”监视一次更改的事件队列。